透過 systemd 服務停止

透過 systemd 服務停止

簡潔版本:如何讓 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完成,系統將像平常一樣在幾秒鐘內關閉。

相關內容