Cómo reiniciar automáticamente un servicio en caso de falla en Linux

23

En Windows, puede configurar lo que debería suceder si / cuando falla un servicio. ¿Existe una forma estándar de lograr lo mismo en Linux (CentOS en particular)?

Una gran parte de mi pregunta es: ¿cómo maneja los sockets que se han dejado abiertos? Por ejemplo, en los estados TIME_WAIT, FIN_WAIT1, etc.

En este momento, si el servicio que estoy desarrollando se bloquea, tengo que esperar a que los sockets se borren o cambien el puerto de escucha antes de poder reiniciarlo manualmente.

Gracias por tu ayuda.

Pryo
fuente

Respuestas:

26

monites una excelente manera de monitorear y reiniciar los servicios cuando fallan, y probablemente terminará usándolo para otros servicios esenciales (como Apache). Hay un buen artículo sobre nixCraft que detalla cómo usar esto para servicios específicamente, aunque en monitsí tiene muchas más funciones más allá de esto.

En cuanto al aspecto del zócalo, @galraen respondió a este punto.

Andrew M.
fuente
Es una pena que tenga que decidir cuál es la respuesta. Debería haber hecho dos preguntas separadas. @gelraen su respuesta acaba de terminar mis semanas de búsqueda de una solución. Le da las gracias por lo tanto! @Redmumba gracias, ¡Monit se ve bien!
Pryo
Cualquiera que usted elija para marcar, sin duda correcta upvote @ respuesta de gelraen. Es correcto, y muy informativo.
Andrew M.
19

Solo responde a la parte de reinicio del servicio. También me encontré con Monit, pero en CentOS 7 systemd se encarga de todo eso por ti. Solo necesita agregar estas dos líneas al archivo .service (si aún no están allí):

Restart=always
RestartSec=3

Ver https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ para referencia.

Si desea crear un servicio systemd personalizado, es bastante sencillo escribir su propio archivo de servicio. Vea el siguiente ejemplo, para un servidor http personalizado.

Inicie el editor con un nuevo archivo de servicio:

vim /etc/systemd/system/httpd.service

Y agregue el siguiente contenido, que puede editar según sea necesario:

[Unit]
Description=My httpd Service
After=network.target

[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Quiero que se inicie automáticamente en el arranque:

systemctl enable httpd

Informe a systemd sobre los cambios e inicie el servicio:

systemctl daemon-reload
systemctl start httpd

Y ahora puedes ver el estado:

systemctl status httpd

Para referencia, consulte https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/

Nagev
fuente
Sí, exactamente, systemdel administrador de servicios estándar en las distribuciones más populares puede hacerlo por usted.
Rolf
13

Puede llamar setsockopt(2)para escuchar socket con SO_REUSEADDR, por lo que podrá volver a bind(2)hacerlo sin esperar a que caduquen todas las conexiones. Otra posibilidad: soltar conexiones del kernel. FreeBSD tiene un tcpdropcomando para esto, no sé sobre Linux.

gelraen
fuente
4

Si su distribución de Linux usa Upstart en lugar de SysV init, entonces la respawnpalabra clave lo hace.

http://upstart.ubuntu.com/cookbook/#respawn

JeffG
fuente
Gracias, esto parece justo, pero desafortunadamente estoy atascado con SysV init.
Pryo