如果我不是那个启动过程的人,有没有办法等到过程结束?
e.g。如果我运行“ps -ef”并选择任何PID(假设我有权访问过程信息) - 有没有办法可以等到PID完成并获得退出代码?
答案 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 +++
来自^Z
,fg
和kill -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