在Linux中,我怎么能等到一个我没有的进程';开始和结束?
我有一个监控程序,我想检查系统中的各个进程,并知道它们何时终止。我还想知道他们的退出密码,以防他们崩溃。但是,我的程序不是要监视的进程的父进程 在Windows中,这很容易:在Linux中,我怎么能等到一个我没有的进程';开始和结束?,linux,process,waitpid,Linux,Process,Waitpid,我有一个监控程序,我想检查系统中的各个进程,并知道它们何时终止。我还想知道他们的退出密码,以防他们崩溃。但是,我的程序不是要监视的进程的父进程 在Windows中,这很容易:OpenProcess对于SYNCHRONIZE权限,WaitForMultipleObjectsEx等待其中任何一个权限终止,然后GetExitCodeProcess找出终止的原因(如果原因是异常,则使用NTSTATUS错误代码) 但是在Linux中,这些的等价物,waitpid,只在您自己的子进程上工作,而不是在不相关的
OpenProcess
对于SYNCHRONIZE
权限,WaitForMultipleObjectsEx
等待其中任何一个权限终止,然后GetExitCodeProcess
找出终止的原因(如果原因是异常,则使用NTSTATUS
错误代码)
但是在Linux中,这些的等价物,waitpid
,只在您自己的子进程上工作,而不是在不相关的进程上工作。我们尝试了ptrace
,但这导致了它自身的问题,比如信号处理速度大大减慢
此程序打算以root用户身份运行
除了轮询
/proc/12345
直到它消失之外,还有什么方法可以实现这一点吗?想不出一种简单的方法来收集终止状态,但是对于简单的死亡事件,您可以作为root,将ope
n调用注入另一端的文件,然后在文件描述符的一端执行select
。
当另一端死亡时,它将在另一端的filedescriptor上生成一个close事件
一个(非常丑陋)的例子:
你能用ptrace发布一个简单的例子吗?在linux中,这看起来是正确的方法,但也许可以改进。
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