我的流程启动了一个流程-在此示例中将其作为外壳,但实际上它适用于任何流程.当Shell创建新进程并获取其PID时,我需要得到通知.
我可以在任何给定时间拍摄整个流程树的快照(好吧,pstree可以),但是如何监视具有给定PID的流程对新流程的创建?
到目前为止,我已经找到了几种方法可以在How to monitor an external process for events by its PID in C?做到这一点,但没有一种能真正解决我的问题:
>监视NetLink proc接口.问题:需要我没有的root权限.
>自定义库覆盖由LD_PRELOAD加载到Shell进程中的syscall.问题:shell的子代也将继承它,我不希望那样-我只想监视shell.
> ptrace()修改外壳.问题:通知父级(即我的进程)有关创建新进程(即PTRACE_O_TRACEFORK,PTRACE_O_TRACEVFORK和PTRACE_O_TRACECLONE)的标志会将ptrace()传播到子进程,而我只想监视外壳程序.
>使外壳配合.问题:在BASH命令中,回调(如undistract-me中所使用)非常hacky.我也希望避免使用特定于shell的代码.
我觉得这里缺少一些简单的东西.我觉得我可以使上述解决方案之一与更多的黑客一起使用,但是…当然,对于这样一个简单的任务,我不必求助于LD_PRELOAD和ptrace()之类的大手笔,对吗?
JFYI我正在用Vala编写代码,但是也欢迎使用C代码片段.
解决方法:
到目前为止,还没有找到通用的解决方案,因此我不得不诉诸于shell的配合:
> ZSH的前执行钩子记录在
http://zsh.sourceforge.net/Doc/Release/Functions.html
> KSH有一个
调试挂钩记录在http://www.manpagez.com/man/1/ksh/中
>可以在以下位置找到将pre-exec添加到BASH的黑客
https://github.com/jml/undistract-me
我只是根据外壳将回调命令写入相关的环境变量中.