Forzar a systemd a verificar el estado del servicio después de n segundos

Forzar a systemd a verificar el estado del servicio después de n segundos

Tengo un servicio systemd (para heka) que me causa algunos dolores de cabeza.

El problema es que "inicio" regresa exitosamente incluso si el demonio heka muere poco después de comenzar. Esto sucede si los archivos de configuración son incorrectos, por ejemplo: el proceso comenzará, verificará la configuración y morirá si no está satisfecho con lo que encuentra. Systemd regresa exitosamente en este caso.

¿Hay alguna forma de obligar a systemd a verificar el estado del programa después de su inicialización? ¿Quizás dormir n segundos después de que haya comenzado el proceso?

Este es el guión:

    [Unit]
    Description=Heka event/metric/log collection and routing daemon
    After=network.target auditd.service
    ConditionPathExists=!/etc/heka/hekad_not_to_be_run

    [Service]
    EnvironmentFile=-/etc/default/heka
    Type=simple
    PIDFile=/var/run/hekad.pid
    ExecStart=/usr/bin/hekad -config=/etc/heka
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    StandardError=inherit

    [Install]
    WantedBy=multi-user.target
    Alias=heka.service

Respuesta1

Puede encadenar varios comandos ExecPostStart juntos. Y puede ejecutarlos incluso si el ExecStart principal falló agregando un-/(systemd.servicio: Tipo =). Algo como esto:

ExecStart=-/usr/bin/hekad -config=/etc/heka
ExecStartPost=/bin/sleep 3
ExecStartPost=/bin/kill -0 $MAINPID &>/dev/null

Esto garantiza que aún podrá MAINPIDutilizarlo al detener o reiniciar el servicio, por ejemplo.

Respuesta2

Si hay una manera fácil de verificar si hekadtodavía está vivo, entonces iniciaría el demonio usando ExecStartPre=/usr/bin/hekad -config=/etc/hekay ExecStartejecutaría un pequeño script que tiene un bucle que primero duerme X segundos, luego verifica si el demonio hekad todavía se está ejecutando. Romper el bucle sólo si hekadparece haberse detenido.

Respuesta3

Debería utilizarlo ExecStartPostpara iniciar un comando o script que se suspenda y luego ejecute una verificación. Si el resultado es distinto de cero, la unidad se considera una falla.

Ver:https://www.freedesktop.org/software/systemd/man/systemd.service.html

información relacionada