Tengo un proceso que se ejecuta mediante el script init.d en segundo plano. P.ej:
case "$1" in
start)
/bin/myprocess &
stop)
killall myprocess
restart)
killall myprocess
/bin/myprocess &
esac
En ciertas condiciones, mi proceso puede fallar y regresar. ¿Hay alguna forma (estándar) de cómo detectar su falla y reiniciar automáticamente?
Respuestas:
La forma más fácil sería agregarlo a / etc / inittab , que está diseñado para hacer este tipo de cosas:
Por ejemplo, podrías hacer esto:
fuente
/etc/inittab
funciona (o incluso existe) si y solo si tiene un sistema de inicio basado en sysvinit. Con advenedizo y con systemd no lo hace. Debe instalar busybox (shell muy primitivo que hace que el sysadm recupere tareas dolorosas, pero puede sustituir a un initd compatible con sysvinit) o sysvinit (es un fósil). En un contenedor acoplable, solo el primero no es doloroso.Buildroot tiene tres posibles sistemas de inicio, por lo que hay tres formas de hacerlo:
BusyBox
init
Con esto, uno agrega una entrada a
/etc/inittab
.Tenga en cuenta que BusyBox
init
tiene un/etc/inittab
formato idiosincrásico . El segundo campo no tiene sentido y el primer campo no es una ID. sino un nombre base del dispositivo.Linux "Sistema V"
init
De nuevo, uno agrega una entrada a
/etc/inittab
.systemd
Uno escribe un archivo de unidad en, digamos
/etc/systemd/system/myprocess.service
,:Habilite esto para iniciar automáticamente en el arranque con:
Comience manualmente con:
Otras lecturas
fuente
service mything start
oservice mything stop
más ... ¿hay alguna manera de tener lo mejor de ambos? es decir, servicio sysvinit no rompible, pero ¿también se puede usar a través del 'servicio'?¿Qué hay de crear una subshell con un bucle que invoca constantemente el mismo proceso?
Si termina, la siguiente iteración del bucle continúa y comienza de nuevo.
Si la subshell muere, se acabó. La única posibilidad en ese caso sería crear otro proceso (lo llamaré nigromante) que verifica si su proceso está vivo, iniciarlo si no lo está y ejecutar este nigromante con cron, para que pueda verificarlo regularmente.
El siguiente paso sería preguntarse qué podría pasar si cron muere, pero en algún momento debería sentirse seguro y dejar de preocuparse.
fuente
Podrías hacer uso de Monit . Es realmente fácil de usar y bastante flexible. Consulte, por ejemplo, esta configuración para reiniciar el proceso de Tomcat en caso de falla.
También tiene muchos ejemplos de configuración para muchos casos de uso.
fuente
Si no es un superusuario o root, y si su sistema Linux tiene Docker instalado, puede crear una imagen de Docker de su proceso, utilizando Docker para reiniciar su proceso si el sistema se reinicia.
Archivo: docker-compose.yml
Para iniciar su contenedor acoplable,
Creo que es fácil manejar mi propio proceso con reinicio automático si no soy un superusuario del sistema.
Para un ejemplo de ejemplo de cómo crear una imagen acoplable, aquí hay un ejemplo rápido:
Archivo: Dockerfile
fuente
En mi caso, como solución rápida, modifiqué y utilicé la solución de @ Trylks para envolver el programa que estaba iniciando. Quería que terminara solo en una salida limpia.
Debería ejecutarse en la mayoría de los depósitos:
fuente
Puedes usar el reiniciador
En los sistemas más nuevos, use systemd que resuelve todos esos problemas triviales
fuente