Linux
如何正確處理服務腳本中 pid.file 的刪除
我正在嘗試為應用程序編寫服務腳本。所以我可以這樣控制它:
./myscript.sh start|stop|status
在啟動
pid.file
時創建程序 ID,並基於它我可以檢查狀態並停止程序。在停止命令中我刪除pid.file
- 沒關係。但是如果應用程序以異常方式崩潰 - 關閉電源等,
pid.file
不會刪除,我需要手動刪除它。如何正確處理腳本中的這種異常情況?
您可以驗證 pid 是否正在執行並且屬於您的應用程序:
pid=$(< "$pidfile") # a bash builtin way to say: pid=$(cat $pidfile) if kill -0 $pid && [[ -r /proc/$pid/cmdline ]] && # find the command line of this process xargs -0l echo < /proc/$pid/cmdline | grep -q "your_program_name" then # your application is running true else # no such running process, or some other program has acquired that pid: # your pid file is out-of-date rm "$pidfile" fi
PID 文件永遠不應被刪除,除非您已解除安裝創建它們的軟體。
PID 文件主要是防止同時執行的安全措施。刪除 PID 文件會使該目的永遠無效。在您取消連結 PID 文件的那一刻,任意數量的程序可能會為其打開文件描述符,並且可能會獲得作業系統對其的排他鎖。
@glenn_jackman 答案中的 else 分支確實應該被刪除。
我已經更詳細地解釋了潛在的問題,包括在http://www.guido-flohr.net/never-delete-your-pid-file/上重現生成的競爭條件的程式碼範例。