【发布时间】:2014-07-11 03:39:27
【问题描述】:
我想在 OSX 上的进程退出之前收到通知,以便我可以在进程终止之前收集有关该进程的统计信息。 (示例细节:我想汇总具有许多子进程的进程的 CPU 使用率,这些子进程会快速生成和死亡,但会使用大量 CPU。当通过 proc_pidinfo 等方式对 CPU 使用率进行采样时,进程的出生和死亡速度相似在我的汇总统计信息中没有充分捕获到我的采样率。我希望在进程死亡时收到通知,以便我可以总结它们的总用户和系统时间。
到目前为止,似乎效果最好的方法是使用libdtrace,但我不知道如何使用dtrace 命令设置进程退出探测,更不用说设置了来自 C 程序的 libdtrace。任何有关设置此类 dtrace 探针的提示以及有关如何使用 libdtrace 的教程将不胜感激。
编辑:
好的,根据一些评论者的建议,我设法创建了一个使用 libdtrace 并可靠地触发进程退出的程序。这很棒,但不幸的是,我似乎无法获得正在退出的进程的 PID。似乎在我的 D 程序中调用 printf() 并尝试格式化整数被严重破坏了。具体来说,如果我运行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); }'。 -
我相信上述内容只会在进程退出后触发。如果你想在它退出时捕捉它,你可以使用探针
syscall::*exit*:entry。要在那里停止进程,您必须允许使用-w选项到dtrace的“破坏性”操作,并在探针主体中使用stop()操作:sudo dtrace -w -n 'syscall::*exit*:entry { stop(); }。然后,您可以在闲暇时检查该过程。要让进程恢复,您必须使用pidresume()操作:sudo dtrace -w -n 'BEGIN { pidresume($pid); }-p`. -
谢谢大家,这实际上正是我想要的!现在唯一的问题是使用 libdtrace。谢谢!