Systemd

使用和不使用 systemctl 殺死 systemd 服務

  • October 17, 2018

像這樣殺死正在執行的守護程序 systemd 服務有什麼區別:

kill -SIGKILL 3645

systemctl -s kill -SIGKILL 3645

其中 3645 是 systemd 服務的 pid。使用第一種方法還有什麼缺點嗎?

首先,您的systemctl語法是錯誤的:systemctl kill需要一個單元名稱,而不是 PID,並且-s需要一個信號名稱。正如所寫,它不會做任何事情,只是給你一個錯誤資訊:

Failed to parse signal string kill.

如果你解決了這個問題,它會告訴你:

Failed to kill unit 3645.service: Unit 3645.service not loaded.

正確的語法是:

systemctl kill -s SIGWHATEVER whatever.service

顯然,不同之處在於您可以基於 systemd 單元而不是 pid 向程序發送信號。因為一個單元可能執行多個程序,systemd 然後可以向該單元下執行的所有程序發送相同的信號,實際上,這是預設設置。該--kill-who=選項允許您在必要時更改此設置。

不過,一般來說,養成向任何東西發送 SIGKILL 的習慣並不是一個好主意。您應該盡可能正常地停止您的服務,例如使用systemctl stop whatever.service. kill -9SIGKILL 與您可能聽說過並被警告過的潛在破壞性相同。而且,如果您通過任何一種方法終止服務並且它被配置為自動重新啟動,它可能會這樣做。這可能是也可能不是您想要的,這取決於您嘗試發送終止信號的原因。

引用自:https://serverfault.com/questions/936037