¿Puede systemd detectar y matar procesos bloqueados?


16

Mientras trabajaba en una solución que utiliza el bloqueo de archivos, creo que mi código está llegando a un punto muerto. Estoy usando systemd para iniciar el proceso en el inicio del sistema. Usar la alarma (3) es una opción, pero me preguntaba si systemd puede detectar procesos bloqueados y reiniciarlos.

Actualmente, para evitar este problema por ahora, estoy planeando mirar la salida de journalctl y si no cambia durante un período de tiempo específico, entonces mataría el proceso a través de un script de shell.

Solo me pregunto si hay una mejor manera de monitorear los procesos a través de systemd o de otra manera.


Probablemente no. ¿Cómo saber si el proceso está bloqueado? ¿Qué pasa si realmente necesitas algo así for(;;) do_something();?
mvp

44
Estrictamente hablando, si su código se cuelga, debe depurar ese problema. Matarlo a través de systemd (suponiendo que se pueda hacer, lo cual no creo) o de cualquier otra manera es lo que debe hacer mientras lo depura. Pero no puedes dejarlo libre para entrar en un punto muerto.
MariusMatutiae

Respuestas:


25

Si; pero primero arregle su programa defectuoso antes de jugar con systemd.

MariusMatutiae es bastante correcto. Tienes un problema con tu programa. Se estanca. Jugar con systemd no es la respuesta. En el mejor de los casos, es una distracción. Arregle su programa para que no se rompa. Dirige tus energías hacia lo correcto.

Dicho esto, otras personas van a venir aquí por el título de la pregunta, en lugar de la pregunta propiamente dicha. Para su beneficio, aquí está la respuesta al título, ignorando la pregunta correcta:

Sí, systemd puede monitorear demonios y reiniciarlos automáticamente si dejan de hablar. Sin embargo, no cualquier viejo demonio. Como señala mvp, no hay forma de saber que un demonio ha colgado (en este universo, donde el problema de detención es indecidible, al menos). Ni systemd ni ningún otro programa de computadora serán capaces de deducir desde cero que algún programa aleatorio lanzado a ellos se ha estancado, o ha entrado en un bucle infinito, o lo que sea. Lo mejor que obtendrá aquí es detectar que un demonio no ha realizado una operación regular de "latido" dentro de un intervalo de tiempo requerido.

Los demonios que aprovechan las capacidades de vigilancia del sistema, por lo tanto, tienen que escribirse para hablar un protocolo específico del sistema, el protocolo sd_notify. Esto complica el código del demonio un poco. Es complicado aún más porque los demonios deberían, si están escritos correctamente, verificar si también han sido invocados con la función de vigilancia habilitada.

Un demonio que habla este protocolo para hacer uso de la capacidad de vigilancia del sistema ...

  • ... debe verificar la WATCHDOG_USECvariable de entorno;
  • ... debe llamar a sd_notify () de forma continua y frecuente, a lo largo de su vida útil, con la WATCHDOG=1opción establecida, en un intervalo de aproximadamente WATCHDOG_USEC/ 2 ("USEC" significa microsegundos);
  • ... debe haber Type=notifyestablecido en su archivo de unidad;
  • ... debería tener NotifyAccess=main(o =all) establecido en su archivo de unidad;
  • ... debe tener WatchdogSec=segundos establecidos en su archivo de unidad.
  • ... debe vincularse con libsystemd-daemon.so

Si desea conocer los detalles de la codificación, después de leer el manual, asegúrese de ir al StackExchange correcto. Este es SuperUser. StackOverflow está por allí .

Otras lecturas


2
Por supuesto, tengo que solucionar el problema, mi única intención era tener un truco temporal hasta que descubra el problema. Gracias por la respuesta detallada.
librepensador
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.