【问题标题】:In Linux, how can I wait until a process I didn't start finishes?在 Linux 中,我怎样才能等到我没有启动的进程完成?
【发布时间】:2015-10-08 00:04:06
【问题描述】:

我有一个监控程序,我想检查系统中的各种进程,并知道它们何时终止。我也想知道他们的退出代码,以防他们崩溃。但是,我的程序不是要监控的进程的父级。

在 Windows 中,这很容易:OpenProcess 获得 SYNCHRONIZE 权限,WaitForMultipleObjectsEx 等待其中任何一个终止,然后 GetExitCodeProcess 找出它终止的原因(如果原因是一个例外)。

但在 Linux 中,这些等价物 waitpid 仅适用于您自己的子进程,而不适用于不相关的进程。我们尝试了ptrace,但这会导致其自身的问题,例如大大减慢信号处理速度。

此程序旨在以 root 身份运行。

除了轮询/proc/12345 直到它消失之外,有没有办法实现这一点?

【问题讨论】:

  • 你能发布一个使用 ptrace 的最小示例吗?这看起来像是在 linux 中的正确方法,但也许可以改进。

标签: linux process waitpid


【解决方案1】:

想不出一个简单的方法来收集终止状态,但是对于简单的死亡事件,您可以以 root 身份将open 调用注入到您将拥有另一端的文件,然后您可以在文件描述符的末尾执行select。 当另一端死亡时,它会在你拥有另一端的文件描述符上生成一个关闭事件。

一个(非常丑陋的)例子:

mkfifo /tmp/fifo #A channel to communicate death events
sleep 1000 &     #Simulate your victim process
echo $! #Make note of the pid you want

 #In another terminal

 sudo gdb -ex "attach $thePid" -ex ' call open("/tmp/fifo",0,0)' -ex  'quit'
 exec 3>/tmp/fifo
 ruby -e 'fd = IO.select([IO.for_fd(3)]); puts "died" '

 #In yet another terminal
 kill $thePid #the previous terminal will print `died` immediately
 #even though it's not the parent of $thePid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 2016-05-19
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多