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

nfs0ujit  于 2022-11-16  发布在  Shell
关注(0)|答案(4)|浏览(269)

如果我不是启动进程的人,有没有办法等到进程完成?
例如,如果我运行“ps -ef”并选择任何PID(假设我有权访问进程信息),是否有办法等待PID完成并获得其退出代码?

tjvv9vkg

tjvv9vkg1#

你可以使用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()来捕获pid的信号和退出代码(它的边缘比较粗糙,可能无法在所有情况下工作)。
我希望这能帮上忙!

ryoqjall

ryoqjall2#

是否有方法可以等到PID完成并获得其退出代码
是的,如果进程没有被其他人ptrace d,你可以PTRACE_ATTACH到它,并得到通知的各种事件(例如,收到的信号),并关于它的退出.
请注意,这是相当复杂的处理正确。

lp0sw83n

lp0sw83n3#

如果您可以不使用退出代码:

tail --pid=$pid -f /dev/null
6yt4nkrj

6yt4nkrj4#

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

wait PID

可以使用$!获取bash中最后一个命令的PID,或者使用grep从ps的输出中获取它。
实际上,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

相关问题