我正在使用 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
在 man 页面中有解释kill
:
如果签名为 0,则不发送信号,但仍会执行错误检查;这可用于检查进程 ID 或进程组 ID 是否存在。