¿Hay alguna manera de reiniciar el proceso pm2 usando cron pero solo si aún no se está ejecutando?

Quiero reiniciar mi aplicación Node.Js usando PM2 a través de

pm2 restart app.js

usando crontab pero SOLO si la aplicación no se está ejecutando (p. ej., si mi servidor se bloqueó y se reinició y pm2 no se reinició).

el comando anterior lo reinicia de todos modos, incluso si se está ejecutando.

¿Cómo lo arreglo?

ACTUALIZAR

No quiero que mi aplicación se reinicie si ya se está ejecutando. Quiero que se reinicie solo si aparece como “detenido” o si no se está ejecutando. Algunas sugerencias ofrecen escribir un guión de bash, pero ¿cuál sería? Probé las opciones a continuación, pero o bien no funcionan o reinician la aplicación incluso si se está ejecutando.

En lugar de iniciar el proceso pm2 dentro del cron, inicie un bashscript que verifique si pm2 ya se está ejecutando y lo reinicia si no es el caso.

Editar

Intente seguir (puede ser que la expresión pgrep deba ajustarse, no sé el nombre exacto del proceso pm2):

 #!/bin/bash pID=$(pgrep -x "pm2") if [ -n "${pID}" ]; then #do nothing echo $pID "already running. not restarting." else # start it echo "restarting" # put your command to start your process here fi 

La mejor manera de hacerlo es usar el pm2 startup

http://pm2.keymetrics.io/docs/usage/startup/

Para obtener el script de inicio configurado automáticamente para su máquina, debe escribir este comando:

 # Detect available init system, generate configuration and enable startup system pm2 startup 

Si lo desea, puede especificar la plataforma que utiliza (donde la plataforma puede ser una de las citadas anteriormente):

 pm2 startup [ubuntu | ubuntu14 | ubuntu12 | centos | centos6 | arch | oracle | amazon | macos | darwin | freebsd | systemd | systemv | upstart | launchd | rcd | openrc] 

La salida de este comando puede ser una recomendación de la línea para copiar / pegar con todas las variables de entorno y las opciones configuradas para usted.

Ejemplo:

[PM2] Tienes que ejecutar este comando como root. Ejecute el siguiente comando: sudo su -c “env PATH = $ PATH: /home/unitech/.nvm/versions/node/v4.3/bin pm2 startup -u –hp

Simplemente tiene que copiar / pegar la línea que PM2 le proporciona y la secuencia de comandos de inicio se configurará para su sistema operativo.

Una vez ejecutado el sudo pm2 startup . Se creará el systemctl service . Puedes consultar el estado del mismo utilizando

 systemctl status pm2-root 

Por defecto el servicio no está configurado para reiniciarse automáticamente. Va a ejecutar los siguientes comandos

 sudo mkdir -p /etc/systemd/system/pm2-root.service.d 

y luego cree un nombre de archivo 10_auto_restart_pm2.conf con el contenido a continuación

 [Service] Restart=always RestartSec=3 

Despues de eso ejecuta

 systemctl daemon-reload systemctl restart pm2-service 

Ahora vamos a probar la parte de reinicio automático

 $ systemctl status pm2-root.service ● pm2-root.service - PM2 process manager Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled) Drop-In: /etc/systemd/system/pm2-root.service.d └─10_auto_restart_pm2.conf Active: active (running) since Wed 2018-02-28 16:52:19 UTC; 11s ago Docs: https://pm2.keymetrics.io/ Process: 5014 ExecStop=/usr/local/lib/node_modules/pm2/bin/pm2 kill (code=exited, status=0/SUCCESS) Process: 5022 ExecStart=/usr/local/lib/node_modules/pm2/bin/pm2 resurrect (code=exited, status=0/SUCCESS) Main PID: 5031 (PM2 v2.10.1: Go) Tasks: 9 Memory: 24.3M CPU: 460ms CGroup: /system.slice/pm2-root.service └─5031 PM2 v2.10.1: God Daemon (/home/vagrant/.pm2) 

Ahora matamos el proceso manualmente y esperamos 3 segundos.

 $ kill -9 5031 $ sleep 3 $ systemctl status pm2-root.service ● pm2-root.service - PM2 process manager Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled) Drop-In: /etc/systemd/system/pm2-root.service.d └─10_auto_restart_pm2.conf Active: active (running) since Wed 2018-02-28 16:52:55 UTC; 641ms ago Docs: https://pm2.keymetrics.io/ Process: 5057 ExecStop=/usr/local/lib/node_modules/pm2/bin/pm2 kill (code=exited, status=0/SUCCESS) Process: 5081 ExecStart=/usr/local/lib/node_modules/pm2/bin/pm2 resurrect (code=exited, status=0/SUCCESS) Main PID: 5088 (PM2 v2.10.1: Go) Tasks: 9 Memory: 24.3M CPU: 461ms CGroup: /system.slice/pm2-root.service └─5088 PM2 v2.10.1: God Daemon (/home/vagrant/.pm2) 

Como puede ver, el proceso / servicio se reinició automáticamente. No se necesita cron y es como debes hacerlo.

Lo que está buscando hacer es iniciar cualquier aplicación detenida sin incurrir en tiempo de inactividad. Una buena solución es usar el comando pm2 startOrReload . Esto iniciará cualquier aplicación detenida y recargará cualquier aplicación actual sin incurrir en tiempo de inactividad.

Necesitará un archivo de configuración para el comando. Si actualmente no tiene uno, puede crearlo utilizando el pm2 ecosystem . Asegúrese de que apunta a app.js

Luego ejecuta este comando en tu tarea cron:

 pm2 startOrReload  

Consulte pm2 -h , pm2 startOrReload -h y pm2 ecosystem -h para obtener más opciones.