Kill
通過fuser而不是pidfile殺死程序?
最近我養成了殺死程序的習慣
fuser -k -n tcp $PORT
這幾乎不能殺死錯誤的程序。我更喜歡這個而不是擺弄一個可能仍然存在或可能不存在或可能包含或可能不包含正確 pid 的 pidfile(好吧,我在這裡有點戲劇性:-)
然而,我偶然發現的典型停止腳本仍然使用 pidfile。
我是否缺少 pidfile 方法的重要功能或 fuser 的錯誤功能
approach
。我最好的猜測是fuser
不可用。雖然從搜尋引擎結果來看,bsd、debian、suse、centos、aix、solaris 似乎都有。
fuser
命令選項是特定於-n <file|udp|tcp>
Linux 的,而基於 PID 文件的解決方案在許多 Unix 變體中是傳統的,因此保證非常便攜。至少在 Debian 中,該
fuser
命令位於psmisc
包中,該包被指定為“可選”,因此不能期望它始終存在於所有系統中。
除了 telcoM 提到的內容之外,這種方法還有兩個潛在的問題,它們都與名為
SO_REUSEPORT
.此套接字選項允許多個程序(所有程序都必須設置該選項)綁定到同一個埠,並將傳統上由主程序完成的連接的負載平衡解除安裝到核心。
由此產生的兩個潛在問題是:
- 對於使用基於程序的並行性(例如 NGinx)並使用此選項的伺服器,連接到套接字的 PID 通常是主程序的子程序,而不是主程序本身。在這種情況下,您的
fuser
方法將殺死所有子程序,但不會向主程序發送任何信號,這可能根本不會終止服務(如果主程序只是重新啟動子程序),或者可能導致它被關閉以導致問題的方式(程式碼可能假設子程序死亡表示致命錯誤,並使用與主程序本身接收信號不同的退出路徑)。- 這可能會殺死您想要的其他程序。這種情況不太可能是一件壞事(您可以殺死的唯一“其他”程序可能是惡意軟體),但值得考慮。