gpt4 book ai didi

linux - 在 Linux 中,我如何才能等到我没有启动的进程完成?

转载 作者:太空狗 更新时间:2023-10-29 11:21:48 24 4
gpt4 key购买 nike

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

在 Windows 中,这很简单:OpenProcess 用于SYNCHRONIZE 权限,WaitForMultipleObjectsEx 等待它们中的任何一个终止,然后 GetExitCodeProcess 找出它终止的原因(如果原因是异常,则使用 NTSTATUS 错误代码)。

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

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

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

最佳答案

想不出一个简单的方法来收集终止状态,但是对于简单的死亡事件,您可以以 root 身份向您将拥有的文件注入(inject)一个 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

关于linux - 在 Linux 中,我如何才能等到我没有启动的进程完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33004447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com