经常用于检查进程是否正在运行的惯用语之一是使用kill -s 0 $pid
.
我的问题是,它比使用构造有什么优点吗[[ -e /proc/$pid ]]
?
我正在编写的脚本是针对 Linux 和 bash 的。
答案1
我更喜欢kill -s 0 pid
vs 测试,/proc/pid
因为前者是可移植的,由 POSIX 指定。即使您的脚本针对 Linux,仍然存在(非常轻微的)/proc
由于某种原因被卸载的风险。
答案2
kill
我通常会使用诸如直接从 读取内容之类的命令/proc
。好处是,诸如此类的工具无论成功与否kill
都会返回状态代码(想想),并且理论上在处理内容而不是自己滚动内容时应该已经包含任何与 API 相关的内容。$?
/proc
此外,使用专用命令可以使代码在各种 Unix 上具有更好的可移植性。/proc
在其他 UNIX(例如 Solaris 和 AIX)上并不普遍。
例子
测试进程被杀死。
$ sleep 10 &
[1] 11639
现在我们杀了它。
$ kill 11639
[1]+ Terminated sleep 10
我们成功了吗?
$ echo $?
0
零意味着我们成功了。其他任何事情,我们都可以用不同的方式处理。直接阅读后/proc
,我们陷入了进退两难的境地。
同样的情况,我们试图杀死一个不存在的进程。
$ kill 61234
bash: kill: (61234) - No such process
我们收到有关它的反馈。
$ echo $?
1
还有什么?
如果您更愿意通过名称而不是 来终止或查找进程,您可能还想研究使用pkill
and 。但这最终取决于您想要做什么。pgrep
$pid
答案3
kill -s 0 $pid
和之间有很大的区别[ -e /proc/$pid ]
。后者测试是否存在具有该 PID 的进程(或僵尸进程)。前者仅匹配您可以向其发送信号的进程(或僵尸),即进程的真实或保存的 UID 必须与您运行该进程的 shell 的 UID 相同(除非 shell 以 root 身份运行,在哪种情况没有区别)。
使用哪一种取决于您是否要匹配其他用户的进程。
kill -s 0 $pid
非常便携(符合 POSIX 标准)。测试/proc/$pid
在 BSD unice 上不起作用,因为它们没有/proc
;实现相同效果的一种便携式方法是ps -p $pid >/dev/null 2>/dev/null
.