2015-06-20 63 views
1

我使用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 
... 
+0

那么,在第二个例子中,它看起来好像pid 2661不存在,所以人们希望看到来自'ps'的非零返回值。也许这个过程在你运行'kill -0'时没有退出? – larsks

+0

不幸的是:'$ pid = 2661;杀-0 $ pid; echo $?; ps -p $ pid; echo $? PID TTY TIME CMD 1' – binwiederhier

回答

0

ayecee在#linux Freenode上回答我的问题。如果$pid是一个正在运行的线程kill -0 $pid将返回0,而ps -p $pid将由htop手工采摘线程PID,然后运行上述命令返回1

我已经验证了这个答案。

相关问题