
我使用的是 RHEL 7.5,並且有一個 Java 程序,其中包含一個帶有 PID 號碼的檔案。如果進程被終止,該文件仍然存在,我正在編寫一個腳本來驗證儲存到該文件中的 PID 是否存在,但我有疑問或問題。
PID 445 存在,2445 存在。那我怎麼才能只得到445呢?
我嘗試使用以下命令:
ps -ax | egrep "^ 445"
但它沒有返回任何東西。
兩個過程:
ps -ax | grep -v grep | egrep "445"
445 pts/2 Sl 3:50 /opt/
2445 ? S 0:00 dbus-launch
答案1
使用-p
:
-p proclist
寫入進程 ID 號碼在 中給予的進程的資訊proclist
。 […]
(來源)
在你的情況下:
ps -p 445
POSIX 表示ps
如果“發生錯誤”,應該會傳回肯定的退出狀態。ps
我測試的每一個都認為proclist
不包含至少一個 PID現存的處理為“錯誤”。這很有用。例子:
ps -p 445 >/dev/null && echo "Process exists."
筆記:
- 終止進程的 PID 最終可能/將會被重複使用,所以即使PID正在使用,它也可能不是你感興趣的進程。
- 如果檔案中的 PID 來自最近(重新)啟動之前,則該進程顯然不再存在,即使 PID 現在正在使用。 (暗示:設定程式以便檔案打開
tmpfs
)。
答案2
kill -0
您可以使用以下命令檢查進程是否正在 Bash 腳本中執行:
if [ -f ${pid_file} ] && kill -0 $(cat ${pid_file}) 2>/dev/null; then
exit
else
rm -rf ${pid_file}
exit
fi
相當於${pid_file}
其中包含 PID 的檔案路徑。檢查-f ${pid_file}
PID 檔案是否存在。然後kill -0 $(cat ${pid_file})
檢查進程是否正在運行。
歸結為:
- 如果進程正在運行,則只需退出腳本即可。
- 否則(如果過程是不是運行時,只需刪除PID檔案即可。
kill -0
手冊頁上解釋了其中的魔力kill
:
如果訊號為0,則不發送訊號,但仍進行錯誤檢查;這可用於檢查進程 ID 或進程組 ID 是否存在。