如果多個進程有相似的PID號,如何選擇一個特定的PID值?

如果多個進程有相似的PID號,如何選擇一個特定的PID值?

我使用的是 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."

筆記:

答案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 是否存在。

相關內容