Заставить systemd проверить состояние службы через n секунд

Заставить systemd проверить состояние службы через n секунд

У меня есть служба systemd (для heka), которая доставляет мне некоторую головную боль.

Проблема в том, что "start" успешно возвращается, даже если демон heka умирает вскоре после запуска. Это происходит, если файлы конфигурации неверны, например: процесс запустится, проверит конфигурацию и умрет, если его не устроит то, что он обнаружит. Systemd успешно возвращается в этом случае.

Есть ли способ заставить systemd проверять статус программы после ее инициализации? Может быть, заснуть на 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

решение1

Вы можете связать несколько команд ExecPostStart вместе. И вы можете запустить их, даже если основной ExecStart не сработал, добавив-/(systemd.service: Тип=). Что-то вроде этого:

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

Это гарантирует, что у вас все еще будет возможность MAINPIDиспользовать его, например, при остановке или перезапуске службы.

решение2

Если есть простой способ проверить, hekadжив ли он еще, то я бы запустил демон с помощью ExecStartPre=/usr/bin/hekad -config=/etc/hekaи ExecStartзапустил небольшой скрипт, который сначала спит X секунд, а затем проверяет, работает ли демон hekad еще. Разрывая цикл только если hekadкажется, что он остановился.

решение3

Вы должны использовать ExecStartPostдля запуска команды или скрипта, который спит, а затем запускает проверку. Если это выходит ненулевым, то блок считается неудачным.

Видеть:https://www.freedesktop.org/software/systemd/man/systemd.service.html

Связанный контент