
簡潔版本:如何讓 systemd 控制的服務觸發立即關閉?
我有一個守護進程,可以透過以(fork/exec'd)結尾的 shell 腳本執行任意操作來回應某些事件
exec halt -p
或者更具體地說,exec $@
,但在本例中$@
是halt -p
。我也嘗試過:
shutdown now
systemctl halt
。
雖然這有效,但似乎存在一個問題,導致關機(通常只需要幾秒鐘)變成需要幾分鐘。我懷疑這是因為 systemd 正在等待服務的子進程(本身halt
),而該服務不會根據請求禮貌地終止。也就是說,這有點像是蛇追逐自己的尾巴的場景。
該服務沒有ExecStop
並且是Type=forking
。
答案1
其中man systemd.kill
對該選項的解釋如下KillMode
:
KillMode=
指定如何終止該單元的進程。之一對照組、過程、混合、無。
如果設定為控制組,此單元控制組中的所有剩餘程序將在單元停止時終止(對於服務:執行停止命令後,如配置
ExecStop=
)。
ExecStop
這意味著單獨定制不會有幫助,但是:
如果設定為流程,只有主進程本身被殺死。
如果設定為沒有任何,沒有進程被殺死。在這種情況下,機組停止時僅執行停止命令,
因此,ExecStop
可以與 結合使用KillMode=none
。如果守護進程啟動持久進程,則這是必要的,以它們而不是halt
.就我而言,它沒有,並且守護進程本身有一個SIGTERM
處理程序並且不等待子進程,因此不需要特殊的清理。因此添加到塊KillMode=process
中[Service]
解決了問題;守護程序被停止,留下來halt
完成,系統將像平常一樣在幾秒鐘內關閉。