【发布时间】:2013-09-25 00:39:51
【问题描述】:
我想检查一个 PID 是否正在运行(即存在并且没有被僵尸化)。
从/proc/$PID/stat 开始确实很快,但我想要更便携的东西。
我现在最好的是:
( STAT="$(ps -ostat= -p$PID)"; test "$STAT" -a "$STAT" "!=" "Z" )
这似乎适用于 BSD 和 Linux。有没有更好的办法?
【问题讨论】:
-
如果你发现一个僵尸,你的计划是什么?您可以简单地查看
kill -0 $PID是成功还是失败,尽管失败可能意味着$PID是僵尸或者没有这样的进程。不过,除非您是操作系统,否则我不确定这是一个有用的区别。 -
@chepner kill -0 在僵尸上返回 0(与正在运行的进程相同)
-
stat-o选项的参数在 POSIX 2008 中没有描述。所以你的代码 sn-p 也不可移植((+1 有趣的问题 -
@gavenkoa
ps的-o选项是在2013 edition中描述的 -
这应该更符合 POSIX:
! ps $PID |awk 'NR == 2 {exit ($3 == "Z")}'-- awk 命令查看第二行(第一行是标题)并在第三列 (STAT) 为“Z”时退出 true , 然后取反 (!),这样 Z 统计数据或无效 PID 将返回 false,而任何其他统计数据将返回 true。