我希望在OSX上进程退出之前能够收到通知,以便在进程死亡之前收集关于该进程的统计信息。(具体示例:我想聚合具有许多快速产生和死亡子进程但使用大量CPU的进程的CPU使用情况。通过像
它只打印出神秘整数的前三个数字。请注意,进程名称是正确的,只是整数 -> 字符串转换失败了。运行上述D程序的主要
proc_pidinfo
这样的采样CPU使用情况时,出生和死亡速率类似于我的采样率的进程无法充分捕获到我的聚合统计数据中。我希望在进程死亡时收到通知,以便我可以总结它们的总用户和系统时间。
到目前为止,看起来最好的方法是使用libdtrace
,但我无法弄清楚如何使用dtrace
命令设置进程退出探针,更不用说从C程序中设置libdtrace
了。如果有关设置此类dtrace探针以及如何使用libdtrace
的教程的提示将不胜感激。
编辑:
好的,根据一些评论者的建议,我成功创建了一个使用libdtrace并可靠地触发进程退出的程序。这很棒,但不幸的是,我似乎无法获得正在退出的进程的PID。调用printf()
来格式化整数的D程序存在问题。具体来说,如果我运行this program,它应该在进程退出时打印出进程的名称和PID,但它失败了。它打印出另一个整数,并且无论我尝试输出什么,都会打印出该整数。如果我将D程序从
syscall::*exit*:entry {
printf(\"%s %d\\n\", execname, curpsinfo->pr_pid);
};
只是
syscall::*exit*:entry {
printf(\"%d\\n\", 100);
};
它只打印出神秘整数的前三个数字。请注意,进程名称是正确的,只是整数 -> 字符串转换失败了。运行上述D程序的主要
dtrace
程序可以正常工作,但我想将其集成到我已经编写了很多内容的C程序中,并且将子命令输出导入该程序并不是我想要前进的方式。帮助我解决如何使libdtrace
的缓冲输出正常工作,或者替代地获得PID作为整数而不是字符串的方法将是很好的。
libdtrace
,但您可以使用以下dtrace
命令来监视进程退出:sudo dtrace -n 'proc:::exit { trace(pid); trace(execname); }'
гЂ‚ - Ken Thomasessyscall::*exit*:entry
。要在那里停止进程,您必须允许 "破坏性" 操作,并使用探针主体中的stop()
操作:sudo dtrace -w -n 'syscall::*exit*:entry { stop(); }
。然后,您可以随意检查进程。要让进程恢复,您必须使用pidresume()
操作:sudo dtrace -w -n 'BEGIN { pidresume($pid); }
-p <the PID>`。 - Ken Thomases