2012-07-11 22 views
5

我一直在使用Bash等到PID不再存在。我試過Bash:使用while或直到等到PID不存在

#!/bin/bash 
while [ kill -0 PID > /dev/null 2>&1 ]; do 
    //code to kill process 
done 
//code to execute after process is dead 

以及

#!/bin/bash 
until [ ! kill -0 PID > /dev/null 2>&1 ]; do 
    //code to kill process 
done 
//code to execute after process is dead 

兩個例子要麼無法正常工作,或繼續的過程結束後循環。我做錯了什麼?

+0

難道你們就不能僅僅用'等待 「$ PID」'? – 2012-07-11 11:28:17

+0

它會返回PID不是shell的子節點。 – hexacyanide 2012-07-11 13:26:00

+0

**除非**您所觀察的過程是一個子過程,否則有幾個缺陷。有關詳細信息,請參閱[此評論](http://stackoverflow.com/questions/1058047/wait-for-any-process-to-finish/1127675#comment24774342_1058047)。 – 2013-06-15 07:42:50

回答

15

你應該簡單地做:

while kill -0 $PID >/dev/null 2>&1 
do 
    # Code to kill process 
done 

循環條件測試的最後一個命令—的退出狀態在這種情況下,kill

「最後」的意義在於,你可以寫:

while sleep 1 
     echo Testing again 
     kill -0 $PID >/dev/null 2>&1 
do 
    # Code to kill process 
done 

這也是測試的kill(和kill單獨)退出狀態。

+0

可能值得添加一個註釋,說明'kill -0'檢查過程。它不完全直觀...... – Nagev 2017-12-18 15:00:39

+0

我想這不是很明顯,但它在問題中使用,所以OP不需要解釋它。 – 2017-12-18 17:16:18

4

你也可以在procfs中的Unix做(幾乎所有除MAC OS)

while test -d /proc/$PID; do 
    kill -$SIGNAL $PID 
    # optionally 
    sleep 0.2 
done 
+1

這將無法在mac上工作 – Somatik 2013-09-27 12:33:30

+0

我沒有注意到mac沒有procfs。 – 2013-09-27 20:14:24