我试图找到一种有效的方法,从用户模式以编程方式监控我的计算机上启动了哪些进程(OS X Yosemite)。由于NSWorkspaceDidLaunchApplicationNotification
仅适用于应用,而kqueues
(NOTE_EXIT
)只允许监控特定进程,因此dtrace探针似乎是最佳选择。我已经使用了/usr/bin/execsnoop
和/usr/bin/newproc.d
(以及剥离版本,只安装了一个探针(syscall::posix_spawn:return
)而没有做任何事情(例如没有打印))。
当我启动一个能够启动多个进程/快速执行多个命令(例如VMWare Fusion)的应用程序时,这些功能非常出色,可以获取我需要的信息但 - 探针似乎显着影响系统。特别是kernel_task
持续时间达到50%+ CPU使用率几秒钟,OS UI(鼠标等)显着减慢/滞后......如果未安装dtrace探测器,则从未观察到此行为。
所以有几个问题:
1)避免这个性能问题的任何方法? (dtrace #pragmas?)
2)dtrace探针累积? (如果我安装dtrace探针,我需要手动卸载它们,还是ctl + C清除/禁用它们?)
3)任何方式来查看当前安装的dtrace探针?
我没有依赖于使用dtrace - 但我不知道另一种(非轮询)方式来获取在OS X上启动的事物的pid /进程名称:/
答案 0 :(得分:2)
在启用单个探针后,我感到非常惊讶,看到了可测量的影响;甚至
dtrace -n syscall::posix_spawn:return
导致问题?如果是这样,你的内存不足吗? DTrace确实需要(默认情况下)适度的数量,并且其初始化可能会推动您超越边缘。除了Fusion之外你还看到了什么问题吗?它似乎在优胜美地遭遇性能问题。
探测器在消费者之间共享。如果只有一个正在运行的消费者(例如dtrace),则退出时将删除所有DTrace探测器。如果两个消费者启用了相同的探测,则它将保持活动状态,直到最后一个消费者退出。
也许。有权访问OS X源代码的人可以修改this script。