等待任意进程并在Linux中获取其退出代码

时间:2012-03-27 15:53:23

标签: linux shell

如果我不是那个启动过程的人,有没有办法等到过程结束?

e.g。如果我运行“ps -ef”并选择任何PID(假设我有权访问过程信息) - 有没有办法可以等到PID完成并获得退出代码?

3 个答案:

答案 0 :(得分:6)

您可以使用跟踪信号和系统调用的strace。以下命令等待程序完成,然后打印退出代码:

$ 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 +++

来自^Zfgkill -USR1的信号也会被打印出来。无论哪种方式,如果要在shell脚本中使用退出代码,则需要使用sed

如果shell代码过多,您可以暂时使用program I hacked together in C。它使用ptrace()来捕获信号并退出pids代码。 (它有粗糙的边缘,可能无法在所有情况下都有效。)

我希望有所帮助!

答案 1 :(得分:3)

  

有没有办法可以等到PID完成并获得退出代码

是的,如果该过程不是由其他人ptrace进行的,您可以PTRACE_ATTACH向其发送,并获得有关各种事件(例如收到的信号)及其退出的通知。

请注意,处理起来非常复杂。

答案 2 :(得分:0)

如果您知道进程ID,则可以使用内置bash的wait命令:

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