Estoy tratando de asegurarme de que un script siga ejecutándose en un servidor de desarrollo. Recopila estadísticas y proporciona un servicio web, por lo que se supone que persiste, pero algunas veces al día desaparece por razones desconocidas. Cuando nos damos cuenta, lo lanzamos nuevamente, pero es un dolor en la parte trasera y algunos usuarios no tienen permiso (o el conocimiento) para ejecutarlo.
El programador que hay en mí quiere dedicar unas horas a llegar al fondo del problema, pero la persona ocupada que hay en mí cree que debe haber una manera fácil de detectar si una aplicación no se está ejecutando y volver a iniciarla.
Sé que podría cron-script ps a través de grep:
ps -A | grep appname
Pero de nuevo, esa es otra hora de mi vida desperdiciada en hacer algo que ya debe existir ... ¿No hay una aplicación prefabricada que pueda pasar a un ejecutable (opcionalmente con argumentos) y que mantendrá un proceso ejecutándose indefinidamente?
En caso de que haga alguna diferencia, es Ubuntu.
/etc/inittab
.Respuestas:
Aviso: Upstart está en modo de mantenimiento y fue abandonado por Ubuntu que usa systemd. Uno debe consultar el manual de systemd para obtener detalles sobre cómo escribir la definición de servicio.
Dado que está utilizando Ubuntu, es posible que le interese Upstart , que ha reemplazado al tradicional sysV init . Una característica clave es que puede reiniciar un servicio si muere inesperadamente. Fedora se ha convertido en un advenedizo y Debian está en fase experimental, por lo que puede valer la pena investigarlo.
Sin embargo, esto puede ser excesivo para esta situación, ya que un script cron tardará 2 minutos en implementarse.
fuente
He usado un script simple con cron para asegurarme de que el programa se esté ejecutando. Si no es así, lo iniciará. Puede que esta no sea la solución perfecta que está buscando, pero es simple y funciona bastante bien.
#!/bin/bash #make-run.sh #make sure a process is always running. export DISPLAY=:0 #needed if you are running a simple gui app. process=YourProcessName makerun="/usr/bin/program" if ps ax | grep -v grep | grep $process > /dev/null then exit else $makerun & fi exit
Luego, agregue un trabajo cron cada minuto o cada 5 minutos.
fuente
process name
si quisiera mantener un script de Python en ejecución?ps ax | grep XXX
para enumerar solo su proceso, luego XXX será.* * * * * ps aux|grep -v grep|grep -q YourProcessName || /usr/bin/program &
Monit es perfecto para esto :)
Puede escribir archivos de configuración simples que le digan a monit que mire, por ejemplo, un puerto TCP, un archivo PID, etc.
monit ejecutará un comando que usted especifique cuando el proceso que está monitoreando no esté disponible / use demasiada memoria / esté fijando la CPU durante demasiado tiempo / etc. También mostrará una alerta por correo electrónico que le indicará lo que sucedió y si podría hacer algo al respecto.
Lo usamos para mantener una gran cantidad de nuestros sitios web en funcionamiento y, al mismo tiempo, nos avisa cuando algo va mal.
- Tu fiel empleado, Monit
fuente
Si está usando una distribución basada en systemd como Fedora y versiones recientes de Ubuntu, puede usar la capacidad "Reiniciar" de systemd para los servicios. Puede configurarse como un servicio del sistema o como un servicio de usuario si necesita ser administrado y ejecutado por un usuario en particular, que es más probable que sea el caso en la situación particular de OP.
La opción Reiniciar toma uno de
no
,on-success
,on-failure
,on-abnormal
,on-watchdog
,on-abort
, oalways
.Para ejecutarlo como usuario, simplemente coloque un archivo como el siguiente en
~/.config/systemd/user/something.service
:entonces:
No se necesitan privilegios de root / modificación de los archivos del sistema, no se necesitan trabajos cron, no hay nada que instalar, es muy flexible (consulte todas las opciones de servicio relacionadas en la documentación).
Consulte también https://wiki.archlinux.org/index.php/Systemd/User para obtener más información sobre el uso de la instancia systemd por usuario.
fuente
He utilizado de cron "killall -0 nombre de programa || /etc/init.d/programname start". kill generará un error si el proceso no existe. Si existe, enviará una señal nula al proceso (que el kernel ignorará y no se molestará en transmitir).
Este modismo es fácil de recordar (en mi humilde opinión). Generalmente utilizo esto mientras todavía estoy tratando de descubrir por qué el servicio en sí está fallando. En mi humilde opinión, un programa no debería desaparecer inesperadamente :)
fuente
Pon tu carrera en un bucle, para que cuando salga, se ejecute de nuevo ... while (true) {run my app ..}
fuente
No pude hacer que la solución de Chris Wendt funcionara por alguna razón, y fue difícil de depurar. Este es prácticamente el mismo pero más fácil de depurar, excluye bash de la coincidencia de patrones. Para depuración basta con ejecutar:
bash ./root/makerun-mysql.sh
. En el siguiente ejemplo con mysql-server, simplemente reemplace el valor de las variables paraprocess
ymakerun
para su proceso.nano /root/makerun-mysql.sh
):#!/bin/bash process="mysql" makerun="/etc/init.d/mysql restart" if ps ax | grep -v grep | grep -v bash | grep --quiet $process then printf "Process '%s' is running.\n" "$process" exit else printf "Starting process '%s' with command '%s'.\n" "$process" "$makerun" $makerun fi exit
Asegúrese de que sea ejecutable agregando los permisos de archivo adecuados (es decir
chmod 700 /root/makerun-mysql.sh
)Luego agregue esto a su crontab (
crontab -e
):# Keep processes running every 5 minutes */5 * * * * bash /root/makerun-mysql.sh
fuente
La
supervise
herramienta dedaemontools
sería mi preferencia, pero entonces todo lo que escribe Dan J Bernstein es mi preferencia :)http://cr.yp.to/daemontools/supervise.html
Tienes que crear una estructura de directorio particular para el script de inicio de tu aplicación, pero es muy simple de usar.
fuente
en primer lugar, ¿cómo se inicia esta aplicación? ¿Se bifurca a un segundo plano? ¿Ha comenzado con nohup .. & etc? Si es el último, verifique por qué murió en nohup.out, si es el primero, compile el registro.
En cuanto a su pregunta principal: puede cron o ejecutar otro proceso en segundo plano (no es la mejor opción) y usar pidof en un bashscript, bastante fácil:
fuente
Podría convertirlo en un servicio lanzado desde inittab (aunque algunos Linux se han movido a algo más nuevo en /etc/event.d). Estos sistemas integrados garantizan que su servicio siga funcionando sin tener que escribir sus propios scripts o instalar algo nuevo.
fuente
Es un trabajo para un DMD (demonio de monitoreo de demonios). hay algunos alrededor; pero por lo general solo escribo un script que verifica si el demonio se está ejecutando, y lo ejecuto si no, y lo pongo en cron para que se ejecute cada minuto.
fuente
Consulte '
nanny
' al que se hace referencia en el Capítulo 9 (p197 o más o menos) del "Unix Hater's Handbook" (una de varias fuentes para el libro en PDF).fuente
Una forma sencilla y agradable de hacer esto es la siguiente:
Si no se está ejecutando, se iniciará, y si se está ejecutando, no. En cualquier caso, su servidor siempre estará activo.
fuente
Creo que una mejor solución es probar la función también. Por ejemplo, si tuviera que probar un apache, no es suficiente con probar si existen procesos "apache" en los sistemas.
Si desea probar si apache está bien, intente descargar una página web simple y pruebe si su código único está en la salida.
Si no es así, elimine el apache con -9 y luego reinicie. Y envíe un correo a la raíz (que es una dirección de correo reenviado a las raíces de la empresa / servidor / proyecto).
fuente
Es aún más simple:
Sin embargo, debe recordar para asegurarse de que el nombre del proceso sea único.
fuente
Uno puede instalar cronjob monitoreando minuciosamente así:
La desventaja es que los nombres de la aplicación que ingresa deben encontrarse en la
ps aux|grep "appname"
salida y, al mismo tiempo, pueden iniciarse con ese nombre:"appname" &
fuente