有没有办法听过程?


9

我想知道是否有一种方法可以监听Linux和UNIX中的进程-何时结束以及process(script)的退出代码是什么。

我不想编写将运行X几秒钟的脚本,并检查ps -ef | grep PID该进程是否仍然存在。我想知道该进程是否可以在结束时通知我以及退出代码是什么。

Answers:


3

Bash为您做到这一点。当进程结束时,它将通过给您回控制来通知您,并将退出状态存储在特殊变量中$?。它大致如下所示:

someprocess
echo $?

有关更多信息,请参见有关特殊参数bash手册

但是我认为您想在等待的同时做其他工作。在bash中,您可以这样操作:

someprocess &
otherwork
wait %+
echo $?

someprocess &将在后台启动该过程。这意味着控制权将立即返回,您可以执行其他工作。在后台启动的进程称为bash作业。wait将等待给定的作业完成,然后返回该作业的退出状态。作业由引用%n%+指最后开始的工作。有关更多信息,请参见有关作业控制bash手册

如果您确实需要PID,也可以这样进行:

someprocess &
PID=$!
otherwork
wait $PID
echo $?

$! 是一个特殊变量,包含上一次启动的后台进程的PID。


以及如何wait运作?系统通常需要占用多少CPU?
2013年

1
我不知道bash到底是如何wait工作的。我确实知道它不会占用大量系统资源。您可以在此处查看源代码:git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.def
lesmana 2013年

6

一种-公认是笨拙-的方法是使用strace

$ strace -e trace=none -e signal=none -p 12345

将使用PID 12345监视该过程,不会拦截任何系统调用(第一个-e),也不会拦截任何信号(第二个-e)。一旦过程以常规方式退出,将打印退出值。

如果该过程被信号终止,则strace静默退出(使用上述给定的选项运行时)。您可以使用例如-e signal=kill更改此行为。但是请注意,如果程序接收并处理了信号,则-e signal=all(或等效地,省略该-e signal选项)可能会产生大量输出。


4
  1. 链接“通知”的执行

    $ process; notify $? &

    请注意,如果进程将以意外方式退出,notify则不会执行

  2. 设置陷阱

    过程通过具有不同含义的信号来发出信号,并且可以做出适当的反应

    #!/bin/bash
    
    process
    
    function finish {
        notify $?
    }
    trap finish EXIT
    

您不清楚要记什么通知。本质上,当然可以是响起“钟声”的任何事物。一对多的例子。notify-sendlibnotify图书馆。

$ process; notify-send "process finished with status $?" &


1

随着ptrace()您可以附加示踪剂的过程(或运行一个新的),设置一个PTRACE_O_TRACEEXIT(Linux的> = 60年2月5日)和睡眠,直到进程退出,然后用PTRACE_GETEVENTMSG得到的退出状态。

这是一个称为stopper的示例实现,我attach仅使用选项进行了检查,并且需要进行一些更改才能使其正常运行(最终,如果需要,我会将代码发布到某处)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.