我有一個 systemd 服務(用於 heka),這讓我有些頭痛。
問題是,即使 heka 守護程式在啟動後不久就終止了,「start」也會成功返回。如果設定檔錯誤,就會發生這種情況,例如:進程將啟動,它將驗證配置,如果對發現的內容不滿意,則會終止。在這種情況下,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
本來啟動守護進程,該腳本有一個首先休眠 X 秒的循環,然後檢查 hekad 守護進程是否仍在運行。僅當循環似乎已停止時才中斷循環。ExecStartPre=/usr/bin/hekad -config=/etc/heka
ExecStart
hekad
答案3
您應該使用ExecStartPost
啟動一個休眠然後執行檢查的命令或腳本。如果該值非零,則該單元被視為故障。
看:https://www.freedesktop.org/software/systemd/man/systemd.service.html