2010-04-02 34 views
5

我试图在Mac OS X上根据它的参数来确定特定进程正在运行的时间。可能有几个进程运行时使用相同的名称,但只有一个进程会有我正在查找的参数。这些进程不是由将运行我的代码的同一用户拥有的。他们不会以任何方式修改他们的argv。ps如何在Mac OS X上显示所有进程的argv?

'ps'命令完全显示我需要的信息。但我非常喜欢不必产生'ps'并解析其输出。

我最初尝试从this question使用sysctl的解决方案,但事实证明,只适用于您拥有的进程;有关更多信息,请参阅my other question

那么ps如何获得其他用户拥有的进程的argv信息呢?

回答

5

在Mac OS X上,ps是setuid 0,它是如何获取所有进程的信息的。你必须以root身份运行才能获取这些信息,所以无论你需要setuid 0还是使用sudo运行你的实用程序。

最好的办法可能只是产卵PS和解析输出,即使你真的不想要;)

+0

所以它是;我没有注意到这一点。至少解决了这个谜团;谢谢。 – DNS 2010-04-02 21:22:55

+0

另外,sysctl键KERN_PROCARGS2被列为'__APPLE_API_UNSTABLE',所以即使你可以使用sysctl,它也会随着苹果的严峻意外而改变。 – ctpenrose 2012-07-12 22:14:28

5

BSD ps(用于Mac OS X)使用kvm_getargv()来获取进程的命令行参数。

以下是实际呼叫:ps source code。搜索kvm_getproc2

请参阅OpenBSD man page该功能家族。

+1

苹果的版本是在这里: http://www.opensource.apple.com/ source/adv_cmds/adv_cmds-138.1/ps/ – Dipstick 2010-04-02 20:59:54

+0

这很有趣,尽管从10.5开始不推荐libkvm(和头文件不可用)。根据Jason Coco的回答,它也会出现,它可能与sysctl具有相同的限制。 – DNS 2010-04-02 21:07:09