如果我不是啓動它的人,是否有辦法等到進程結束?等待任意進程並在Linux中獲取其退出代碼
例如如果我運行「ps -ef」並選擇任何PID(假設我有權訪問進程信息) - 是否有一種方法可以等到PID完成並獲取其退出代碼?
如果我不是啓動它的人,是否有辦法等到進程結束?等待任意進程並在Linux中獲取其退出代碼
例如如果我運行「ps -ef」並選擇任何PID(假設我有權訪問進程信息) - 是否有一種方法可以等到PID完成並獲取其退出代碼?
如果你知道進程的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
有沒有辦法,我可以等到PID完成,並獲得其退出代碼
是的,如果過程沒有被ptrace
d。通過別人的時候,你可以PTRACE_ATTACH
,並且得到關於各種事件(例如接收到的信號)以及關於其退出的通知。
請注意,這樣處理得相當複雜。
它可以用於任意進程嗎? from http://linux.die.net/man/2/ptrace - ptrace()系統調用提供了一種方法,通過該方法,**父**進程可以觀察和控制另一個進程的執行。 – user1296013 2012-03-27 16:40:01
@ user1296013是的,它可以用於你有權限的任意進程(也就是沒有被捕獲)(例如,如果你可以殺死它)。一旦你「追蹤(PTRACE_ATTACH,..)」它,你就成爲父母。 – 2012-03-27 16:59:28
@EmployedRussian你應該在[Greg's Wiki](http://mywiki.wooledge.org/ProcessManagement)中加入這個。 – l0b0 2012-03-28 13:52:27
你可以使用strace
,它跟蹤信號和系統調用。下面的命令等待,直到程序完成,然後打印出它的退出代碼:從^Z
,fg
和kill -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的代碼。 (它有粗糙的邊緣,可能不適用於所有情況。)
我希望有幫助!
是的。但是,想補充一點,如果該pid是您的孩子之一,您只能等待pid的退出代碼。 – 2012-03-27 15:59:42
啊,謝謝@Apprentice Queue,我不知道。 – 2012-03-27 16:01:34
這隻適用於調用原始進程的shell;不是爲了任意的過程。 – 2012-03-27 16:02:29