Answers:
Bash为您做到这一点。当进程结束时,它将通过给您回控制来通知您,并将退出状态存储在特殊变量中$?
。它大致如下所示:
someprocess
echo $?
但是我认为您想在等待的同时做其他工作。在bash中,您可以这样操作:
someprocess &
otherwork
wait %+
echo $?
someprocess &
将在后台启动该过程。这意味着控制权将立即返回,您可以执行其他工作。在后台启动的进程称为bash作业。wait
将等待给定的作业完成,然后返回该作业的退出状态。作业由引用%n
。%+
指最后开始的工作。有关更多信息,请参见有关作业控制的bash手册。
如果您确实需要PID,也可以这样进行:
someprocess &
PID=$!
otherwork
wait $PID
echo $?
$!
是一个特殊变量,包含上一次启动的后台进程的PID。
wait
工作的。我确实知道它不会占用大量系统资源。您可以在此处查看源代码:git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.def
一种-公认是笨拙-的方法是使用strace
:
$ strace -e trace=none -e signal=none -p 12345
将使用PID 12345监视该过程,不会拦截任何系统调用(第一个-e
),也不会拦截任何信号(第二个-e
)。一旦过程以常规方式退出,将打印退出值。
如果该过程被信号终止,则strace静默退出(使用上述给定的选项运行时)。您可以使用例如-e signal=kill
更改此行为。但是请注意,如果程序接收并处理了信号,则-e signal=all
(或等效地,省略该-e signal
选项)可能会产生大量输出。
链接“通知”的执行
$ process; notify $? &
请注意,如果进程将以意外方式退出,notify
则不会执行
设置陷阱
过程通过具有不同含义的信号来发出信号,并且可以做出适当的反应
#!/bin/bash
process
function finish {
notify $?
}
trap finish EXIT
您不清楚要记什么通知。本质上,当然可以是响起“钟声”的任何事物。一对多的例子。notify-send
从libnotify
图书馆。
$ process; notify-send "process finished with status $?" &
如果您的进程运行为守护进程,请考虑使用upstart或monit,它们是一种标准方式:
http://www.alexreisner.com/code/upstart
他们可以监视进程,退出代码,重新启动进程,写入日志,...
wait
运作?系统通常需要占用多少CPU?