Solución:
La mejor forma de hacerlo es utilizar el pm2 startup
mando
http://pm2.keymetrics.io/docs/usage/startup/
Para obtener la secuencia de comandos de inicio configurada automáticamente para su máquina, debe escribir este comando:
# Detect available init system, generate configuration and enable startup system
pm2 startup
Puede especificar la plataforma que usa usted mismo si lo desea (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]
El resultado de este comando puede ser una recomendación de la línea para copiar / pegar con todas las variables de entorno y 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 le proporciona PM2 y el script de inicio se configurará para su sistema operativo.
Una vez que ejecuta el sudo pm2 startup
. Creará el systemctl service
. Puedes comprobar el estado del mismo usando
systemctl status pm2-root
De forma predeterminada, el servicio no está configurado para reiniciarse automáticamente. Ejecutarás los siguientes comandos
sudo mkdir -p /etc/systemd/system/pm2-root.service.d
y luego crea un nombre de archivo 10_auto_restart_pm2.conf
con contenido a continuación
[Service]
Restart=always
RestartSec=3
Después de eso ejecutar
systemctl daemon-reload
systemctl restart pm2-service
Ahora probemos 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 así 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 utilizar el pm2 startOrReload
mando. Esto iniciará las aplicaciones detenidas y volverá a cargar las aplicaciones actuales sin incurrir en tiempo de inactividad.
Necesitará un archivo de configuración para el comando. si no tiene uno, puede crearlo usando pm2 ecosystem
. Asegúrate de que apunte a app.js
.
Luego ejecute este comando en su trabajo cron:
pm2 startOrReload <your ecosystem file>
Ver pm2 -h
, pm2 startOrReload -h
, y pm2 ecosystem -h
para más opciones.
En lugar de iniciar el proceso pm2 dentro del cron, inicie un bashscript que verifica si el pm2 ya se está ejecutando y lo reinicia si no es el caso.
Editar
Intente seguir (podría 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