2010-04-02 113 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