如果多个进程具有相似的 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在 man 页面中有解释kill

如果签名为 0,则不发送信号,但仍会执行错误检查;这可用于检查进程 ID 或进程组 ID 是否存在。

相关内容