$ 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()来捕获pid的信号和退出代码(它的边缘比较粗糙,可能无法在所有情况下工作)。 我希望这能帮上忙!
4条答案
按热度按时间tjvv9vkg1#
你可以使用
strace
,它跟踪信号和系统调用。下面的命令等待直到程序完成,然后输出它的退出代码:来自
^Z
、fg
和kill -USR1
的信号也会被打印出来。无论哪种方式,如果你想在shell脚本中使用退出代码,你都需要使用sed
。如果shell代码太多,可以使用program I hacked together in C,它使用
ptrace()
来捕获pid的信号和退出代码(它的边缘比较粗糙,可能无法在所有情况下工作)。我希望这能帮上忙!
ryoqjall2#
是否有方法可以等到PID完成并获得其退出代码
是的,如果进程没有被其他人
ptrace
d,你可以PTRACE_ATTACH
到它,并得到通知的各种事件(例如,收到的信号),并关于它的退出.请注意,这是相当复杂的处理正确。
lp0sw83n3#
如果您可以不使用退出代码:
6yt4nkrj4#
如果您知道进程ID,则可以使用bash内置的
wait
命令:可以使用
$!
获取bash中最后一个命令的PID,或者使用grep从ps
的输出中获取它。实际上,wait命令是在bash中运行parralel命令的一种有用方式。