如何在Linux中持续监控进程创建?

4
我的进程启动了一个进程——以shell为例,但实际上适用于任何进程。我需要在shell创建新进程并获取它们的PID时得到通知。
我可以在任何给定时间拍摄整个进程树(好吧,pstree可以),但如何监视具有给定PID的进程创建新进程呢?
到目前为止,我已经找到了几种方法,在这里 How to monitor an external process for events by its PID in C?,但没有一种真正解决我的问题:
1. 监控NetLink proc接口。问题:需要root权限,我没有。 2. 自定义库覆盖由LD_PRELOAD加载到shell进程中的syscalls。问题:它也会被shell的子进程继承,而我不想要这个——我只想监视shell。 3. ptrace() shell。问题:通知父进程(即我的进程)有关创建新进程的标志,即PTRACE_O_TRACEFORK、PTRACE_O_TRACEVFORK和PTRACE_O_TRACECLONE将ptrace()传递给子进程,而我只想监视shell。 4. 使shell合作。问题:在BASH命令回调中(如undistract-me中使用的),非常hacky。我也更喜欢避免特定于shell的代码。
我觉得我在这里错过了一些简单的东西。我感觉我可以通过更多的黑客方法使上述解决方案之一起作用,但是……我难道不需要使用像LD_PRELOAD和ptrace()这样的大炮来完成这么简单的任务吗?
JFYI我在Vala中编写此代码,但欢迎C片段。

为了记录起见,我不得不让shell合作。ZSH有一个称为pre-exec hook的钩子,文档在http://zsh.sourceforge.net/Doc/Release/Functions.html中提供;KSH有一个称为debug hook的钩子,文档在http://www.manpagez.com/man/1/ksh/中提供;可以在https://github.com/jml/undistract-me找到将pre-exec添加到BASH的hack。 - Shnatsel
1个回答

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接