2015-06-20 62 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

我已經驗證了這個答案。

相關問題