¿Cómo supervisar y reiniciar automáticamente un proceso?

34

Quiero tener un proceso que se reiniciará si falla. Busqué en Google un poco y descubrí que una solución fácil es usar Daemontools .

No entendí cómo configurarlo.

  1. ¿Cuál es la forma más fácil de lograr tal funcionalidad?
  2. ¿Cómo configurarlo?
opc0de
fuente

Respuestas:

29

Esta respuesta se aplica a las versiones de Ubuntu con Upstart (<= 14.10). Utilice otro enfoque para versiones con Systemd (> = 15.04).

Parece que está buscando una funcionalidad ya proporcionada en Ubuntu con Upstart . La respawnestrofa en la configuración hará exactamente lo que necesita. Recomendaría contra el uso de una forma menos estándar de lidiar con esto.

Sin más detalles sobre el proceso que está tratando de administrar con él, es difícil decir cómo debería ser la configuración. Depende de si se bifurca y se pone en segundo plano, por ejemplo. La documentación de Upstart sobre la respawnestrofa debería brindarle más información.

Desafortunadamente, todavía no es posible ejecutar trabajos de usuario correctamente: no puede iniciarse para ejecutar trabajos de usuario

Ejemplo

Supongamos que queremos mantener la aplicación Calculadora en funcionamiento, incluso cuando se está matando con fuego (señal 9).

  1. Cree un archivo de configuración en /etc/init/calculator.conf(basado en este artículo ):

    #!upstart
    description "Calculator"
    
    # Start job via the daemon control script. Replace "gert" with your username.
    exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator'
    
    # Restart the process if it dies with a signal
    # or exit code not given by the 'normal exit' stanza.
    respawn
    
    # Give up if restart occurs 10 times in 90 seconds.
    respawn limit 10 90
    
  2. Comience ejecutando

    sudo start calculator
    
  3. Se abre en su pantalla actual ( :0) y disfruta de la genialidad al ver que se reinicia después de cerrarlo.

    • Identifique la identificación del proceso, por ejemplo, haciendo ps aux | grep calculator:

      gert  13695 0.2 0.4 349744 16460 ?   Sl   13:38   0:00 /usr/bin/gnome-calculator
      
    • Mátalo con fuego.

      sudo kill -9 13695
      
    • Míralo reaparecer:

      gert  16059 4.6 0.4 349736 16448 ?   Sl   13:40   0:00 /usr/bin/gnome-calculator
      

Tenga en cuenta que esto será más elegante con los planes para los planes de Ubuntu 13.04 con el soporte de trabajo de usuario adecuado.

gertvdijk
fuente
¿Tengo un trabajo desconocido cuando intento iniciarlo? cualquier idea he colocado el archivo en / etc / init
opc0de
@ opc0de El nombre del archivo servicename.confdebe coincidir con el comando para comenzar start servicename. Sospecho que has elegido un nombre diferente.
gertvdijk
no, coincide pero no seguí tu ejemplo, así que creo que podría tener un error de sintaxis.
opc0de
@ opc0de Bueno, comience explicando más sobre lo que está tratando de lograr en la pregunta: qué tipo de aplicación / proceso y cómo lo ejecuta, por ejemplo, así como los detalles sobre su intento actual.
gertvdijk
Resuelto con su ejemplo, mi error fue que probablemente tuve un error en la declaración ejecutiva. ¡Gracias por tu ayuda!
opc0de
13

Una herramienta extremadamente simple que puede lograr el mismo efecto sin necesidad de configuración es immortal: https://immortal.run/

Simplemente ejecute el comando así:

immortal <cmd>

Se ejecutará en segundo plano y se reiniciará automáticamente si sale.

  • immortalctl: Ver el estado de los trabajos en ejecución. Hay una namecolumna que se imprimirá aquí, puede usarla para referirse al trabajo con otros comandos de control.
  • immortalctl stop <name>: Deja de supervisar el trabajo con el nombre (no se reiniciará automáticamente, pero el proceso actual continuará ejecutándose)
  • immortalctl -k <name>: Envía SIGKILL al proceso actual.
  • immortalctl exit <name>: Detiene la supervisión del trabajo con el nombre de pila y lo elimina de la lista de trabajos.
motor extropico
fuente
1
Gracias, esto funcionó muy bien para mi caso de uso en 16.04. Poniendo esto en mi bolsa de herramientas útiles.
Quentin Skousen
2
De hecho, esto se ve más liviano que advenedizo / reaparición.
Sridhar Sarnobat
¿Hay alguna manera de que se muestre stdouty esté stderren primer plano?
David S.
No conozco uno, ya que generalmente se usa para ejecutar un proceso en segundo plano. Sin embargo, puede usar immortalctl -l out.log <cmd> && tail -f out.logpara lograr el mismo efecto.
motor extropico
@DavidS. podría obtener un registro combinado o stdout y stderr inmortal.run/post/stderr
nbari
1

Si no necesita la funcionalidad del proceso daemon / service / background y solo desea hacerlo en la consola, cree un archivo llamado autorestart.sh:

#!/bin/bash

while [ 1 ]; do
  some_command
done

Luego ./autorestart.shse reiniciará automáticamente some_commandsi sale o se bloquea. CTRL-C rompe el ciclo y sale del programa limpiamente.

Probado en Ubuntu 18.04.

Jan Święcki
fuente
0

Hay una manera sin "Upstart". La palabra clave es "inittab" :-). Aunque ese es un archivo que generalmente no se altera por defecto, se puede usar para lograr el reaparecimiento deseado en las máquinas SYSV.

cepal67
fuente
No entiendo por qué alguien rechazó esta solución. Si no lo entiendes, solo búscalo en google; No tiene sentido cortar y pegar aquí las páginas de manual de initttab, ¡puede leerlas usted mismo en su sistema! simplemente escriba "man inittab" ...
cepal67
13
Las respuestas de alta calidad detallan más que "usa esto, descúbrelo por tu cuenta" :)
Seth
0

ps-watcher es una herramienta que observa qué procesos se están ejecutando y ejecuta una acción en circunstancias definidas. Vamos a instalarlo:

apt-get install ps-watcher

Consulte la parte inferior de Ejecución de HHVM con respaldo a PHP-FPM para obtener más detalles; esto me ha funcionado bien.

Jardín de fuego
fuente
Como no es muy largo, agregue un resumen del código en lugar del artículo porque solo se aplica una sección muy corta a esta pregunta.
derHugo