У меня есть служба 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