使用 `kill -s 0 $pid` 与 `[[ -e /proc/$pid ]]` 来检测 PID 是否正在运行

使用 `kill -s 0 $pid` 与 `[[ -e /proc/$pid ]]` 来检测 PID 是否正在运行

经常用于检查进程是否正在运行的惯用语之一是使用kill -s 0 $pid.

我的问题是,它比使用构造有什么优点吗[[ -e /proc/$pid ]]

我正在编写的脚本是针对 Linux 和 bash 的。

答案1

我更喜欢kill -s 0 pidvs 测试,/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

还有什么?

如果您更愿意通过名称而不是 来终止或查找进程,您可能还想研究使用pkilland 。但这最终取决于您想要做什么。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.

相关内容