2012-03-27 109 views

回答

0

如果你知道進程的ID,你可以使用wait命令,它是一個bash內建的:

wait PID 

你可以使用$!在bash的最後一個命令運行的PID。或者,您可以從ps的輸出中獲得grep。

實際上,wait命令是在bash中運行parralel命令的一種有用方法。這裏有一個例子:

# Start the processes in parallel... 
./script1.sh 1>/dev/null 2>&1 & 
pid1=$! 
./script2.sh 1>/dev/null 2>&1 & 
pid2=$! 
./script3.sh 1>/dev/null 2>&1 & 
pid3=$! 
./script4.sh 1>/dev/null 2>&1 & 
pid4=$! 

# Wait for processes to finish... 
echo -ne "Commands sent... " 
wait $pid1 
err1=$? 
wait $pid2 
err2=$? 
wait $pid3 
err3=$? 
wait $pid4 
err4=$? 

# Do something useful with the return codes... 
if [ $err1 -eq 0 -a $err2 -eq 0 -a $err3 -eq 0 -a $err4 -eq 0 ] 
then 
    echo "pass" 
else 
    echo "fail" 
fi 
+8

是的。但是,想補充一點,如果該pid是您的孩子之一,您只能等待pid的退出代碼。 – 2012-03-27 15:59:42

+0

啊,謝謝@Apprentice Queue,我不知道。 – 2012-03-27 16:01:34

+1

這隻適用於調用原始進程的shell;不是爲了任意的過程。 – 2012-03-27 16:02:29

3

有沒有辦法,我可以等到PID完成,並獲得其退出代碼

是的,如果過程沒有被ptrace d。通過別人的時候,你可以PTRACE_ATTACH,並且得到關於各種事件(例如接收到的信號)以及關於其退出的通知。

請注意,這樣處理得相當複雜。

+0

它可以用於任意進程嗎? from http://linux.die.net/man/2/ptrace - ptrace()系統調用提供了一種方法,通過該方法,**父**進程可以觀察和控制另一個進程的執行。 – user1296013 2012-03-27 16:40:01

+0

@ user1296013是的,它可以用於你有權限的任意進程(也就是沒有被捕獲)(例如,如果你可以殺死它)。一旦你「追蹤(PTRACE_ATTACH,..)」它,你就成爲父母。 – 2012-03-27 16:59:28

+0

@EmployedRussian你應該在[Greg's Wiki](http://mywiki.wooledge.org/ProcessManagement)中加入這個。 – l0b0 2012-03-28 13:52:27

6

你可以使用strace,它跟蹤信號和系統調用。下面的命令等待,直到程序完成,然後打印出它的退出代碼:從^Zfgkill -USR1

$ strace -e none -e exit_group -p $PID  # process calls exit(1) 
Process 23541 attached - interrupt to quit 
exit_group(1)       = ? 
Process 23541 detached 

$ strace -e none -e exit_group -p $PID  # ^C at the keyboard 
Process 22979 attached - interrupt to quit 
--- SIGINT (Interrupt) @ 0 (0) --- 
Process 22979 detached 

$ strace -e none -e exit_group -p $PID  # kill -9 $PID 
Process 22983 attached - interrupt to quit 
+++ killed by SIGKILL +++ 

信號得到印刷了。無論哪種方式,如果您想在shell腳本中使用退出代碼,則需要使用sed

如果這樣的shell代碼太多,可以在返回時使用program I hacked together in C a。它使用ptrace()來捕獲信號並退出pid的代碼。 (它有粗糙的邊緣,可能不適用於所有情況。)

我希望有幫助!