我对以编程方式监视进程的状态感兴趣(这不是我自己的进程,也不是我自己进程的子进程)。每当给定的进程exec
(或其变体之一)发生时,是否有一个递增的计数器或一个发生变化的标识符等?我已经检查了sysctl
、等标题libproc.h
,但我找不到任何类似的内容。
显然PID不会改变,但是可执行路径、参数、环境变量可能改变。我可以轮询这些值,并检测它们的变化。任何更改都表明exec
发生了变化,但也有可能(尽管奇怪)进程可以exec
使用相同的可执行文件、args 和 env 进行调用,这不会引发我的警报。
我最终对达尔文所做的事情感兴趣,但我很想听听任何*尼克斯中可能存在的任何类似机制。这至少会给我一个进一步研究的起点
答案1
根据您的操作系统,您可能应该使用:
strace # on linux. you can attach to a pid (if you (as root?) have the rights to do so)
# you can also "follow its children" (using the appropriate options : `man strace` )
其他 UNIX 上也存在等效的(具有不同功能)(并且也可能安装在您的操作系统上):
dtrace # bsd originated, I believe. Should be present also on macos?
dtruss # on macos
truss # on aix
ETC。
对于每个:您将需要找到做您想做的事情所需的适当论据。 (例如,通常默认值会隐藏丢失的内容,并将系统调用参数截断为仅前几个字符等:所有这些都可以通过选项进行更改)
看看它是否在 stderr 上输出内容(可能)。并将其包装在一个脚本中,该脚本根据您需要它执行的操作进行操作。 (例如: 2>/some/tracefile # 并有另一个脚本 tail -f /some/tracefile 并在看到这个或那个系统调用出现时采取行动。)