为什么`kill -0 $ pid; echo $?`和`ps -p $ pid; echo $?`有时会有所不同?

时间:2015-06-20 21:14:17

标签: linux

我使用kill -0 $pid(从PID文件中读取$ pid)来检查守护程序是否正在运行。我刚刚发现即使kill -0 2661返回0,我也无法看到tophtopps aux中正在运行的流程。特别是,ps -p $pid会返回1

为什么?

示例输出:

$ pid=2661; kill -0 $pid; echo $?
0

$ pid=2661; ps -p $pid; echo $?
  PID TTY          TIME CMD
1

同样如此:

$ pid=2661; kill -0 $pid; echo $?; ps -p $pid; echo $?
0
  PID TTY          TIME CMD
1

修改

这似乎比我想象的更频繁。这是一个用于检查PID 1到2000的小片段(仅适用于root):

# for pid in $(seq 1 2000); do killcode=$(kill -0 $pid 2>/dev/null; echo $?); pscode=$(ps -p $pid >/dev/null 2>&1; echo $?); if [ $killcode != $pscode ]; then echo $pid $killcode $pscode; fi done
820 0 1
821 0 1
822 0 1
974 0 1
977 0 1
1029 0 1
1030 0 1
...

1 个答案:

答案 0 :(得分:0)

Freenode上#linux的

ayecee 回答了我的问题。如果$pid是正在投放的主题,则kill -0 $pid将返回0,而ps -p $pid将返回1.

我已通过从htop手动挑选线程PID然后运行上述命令来验证此答案。