2010-04-02 8 views
5

Sto cercando di identificare quando un particolare processo è in esecuzione, basato sui suoi argomenti, su Mac OS X. Possono esserci diversi processi in esecuzione con lo stesso nome, ma solo uno avrà gli argomenti che sto cercando. I processi non sono di proprietà dello stesso utente che eseguirà il mio codice. Non avranno modificato il loro argv in alcun modo.In che modo ps mostra l'argv per tutti i processi su Mac OS X?

Il comando "ps" mostra esattamente le informazioni di cui ho bisogno. Ma preferirei di gran lunga non dover generare 'ps' e analizzare la sua produzione.

Inizialmente ho provato la soluzione da this question, utilizzando sysctl, ma risulta che funziona solo per i processi che possiedi; vedi my other question per maggiori informazioni.

Quindi, come ottiene le informazioni sull'argup per i processi di proprietà di altri utenti?

risposta

5

Su Mac OS X ps è setuid 0, che è il modo in cui ottiene le informazioni per tutti i processi. È necessario eseguire come root per ottenere tali informazioni, quindi è necessario essere setuid 0 o eseguire l'utilità con sudo.

Il modo migliore è probabilmente solo per deporre le uova ps e analizzare l'output, anche se non si ha realmente desidera;) versione

+0

Così è; Non l'avevo notato. Questo risolve almeno il mistero; Grazie. – DNS

+0

Anche la chiave sysctl KERN_PROCARGS2 è elencata come "__APPLE_API_UNSTABLE" quindi, anche se è possibile utilizzare sysctl, è soggetta a cambiamenti nel capriccio di Apple. – ctpenrose

5

BSD ps (utilizzato in Mac OS X) utilizza kvm_getargv() per ottenere gli argomenti della riga di comando per un processo.

Questa è la chiamata effettiva: ps source code. Cerca kvm_getproc2.

Vedere OpenBSD man page per questa famiglia di funzioni.

+1

di Apple è qui: http://www.opensource.apple.com/ source/adv_cmds/adv_cmds-138.1/ps/ – Dipstick

+0

Questo è interessante, sebbene libkvm sia deprecato (e le intestazioni non disponibili) dal 10.5 in poi. Appare anche, sulla base della risposta di Jason Coco, che potrebbe avere la stessa limitazione di sysctl. – DNS