【发布时间】:2014-03-27 18:16:41
【问题描述】:
我的进程启动了一个进程——在这个例子中让它成为一个外壳,但它实际上适用于任何进程。当 shell 创建新进程并获取它们的 PID 时,我需要得到通知。
我可以在任何给定时间拍摄整个进程树的快照(好吧,pstree 可以),但是我如何监控具有给定 PID 的进程创建的新进程?
到目前为止,我在How to monitor an external process for events by its PID in C? 找到了几种方法,但都没有真正解决我的问题:
- 监控 NetLink proc 接口。 问题:需要我没有的root权限。
- 覆盖由
LD_PRELOAD加载到shell 进程中的系统调用的自定义库。 问题:它也会被 shell 的子代继承,我不希望这样 - 我只想监控 shell。 -
ptrace()ing 外壳。 问题: 通知父进程(即我的进程)创建新进程的标志,即PTRACE_O_TRACEFORK、PTRACE_O_TRACEVFORK和PTRACE_O_TRACECLONE将ptrace()ing 传播到子进程,我只想监控外壳。 - 使外壳相互配合。 问题: 在 BASH 命令回调(如在 undistract-me 中使用的)非常 hacky。我还希望避免使用特定于 shell 的代码。
我觉得我在这里遗漏了一些简单的东西。我觉得我可以使上述解决方案之一与更多 hacks一起工作,但是......我当然不必求助于像LD_PRELOAD和ptrace()这样的大枪简单的任务,是吗?
JFYI 我正在 Vala 中编写此代码,但也欢迎使用 C sn-ps。
【问题讨论】:
-
所以为了记录,我不得不让shell合作。 ZSH 在 zsh.sourceforge.net/Doc/Release/Functions.html 中记录了 pre-exec 钩子,KSH 在 manpagez.com/man/1/ksh 中记录了调试钩子,在 github.com/jml/undistract-me 中可以找到将 pre-exec 添加到 BASH 的 hack
标签: c linux process monitoring vala