Linux

如何正確處理服務腳本中 pid.file 的刪除

  • November 11, 2018

我正在嘗試為應用程序編寫服務腳本。所以我可以這樣控制它:

./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/上重現生成的競爭條件的程式碼範例。

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