come ottenere il nome del file di processo dal PID in MacOS?


13

È possibile ottenere un nome file di un processo utilizzando PID? ps visualizza molte informazioni utili su un processo, ma non un suggerimento sulla posizione del file eseguibile di un processo.

Risposte:


13

Un modo per ottenere la posizione binaria del processo è utilizzare lsofe grepper il primo txtsegmento. Ad esempio, nella shell per vedere quale binario è la shell, utilizzare il PID della shell al posto di $$.

$ lsof -p $$ | grep txt
bash    78228 blair  txt    REG   14,2   1244928   6568359 /bin/bash
bash    78228 blair  txt    REG   14,2   1059792  23699809 /usr/lib/dyld
bash    78228 blair  txt    REG   14,2 136368128  81751398 /private/var/db/dyld/dyld_shared_cache_i386

Puoi vedere che la shell sta usando /bin/bash.

Questa tecnica funziona se il processo è stato avviato utilizzando un percorso assoluto o relativo. Ad esempio, andando in una shell e in esecuzione

$ sleep 1234567

e l'utilizzo psin un'altra shell mostra solo come è stato lanciato:

$ ps auxww|grep '[s]leep'
blair    79462   0.0  0.0   600908    744 s011  S+   11:17PM   0:00.00 sleep 1234567

usando lsofmostra quale binario ha eseguito:

$ lsof -p 79462 | awk '$4 == "txt" { print $9 }'
/opt/local-development/bin/gsleep

Ho installato MacPorts coreutils + with_default_names, il che spiega che l'ho preso gsleepe non /bin/sleep.


Il piping dell'output di lsof tramite awk funziona alla grande, con un'aggiunta minore. Ho aggiunto ; exitdopo la dichiarazione di stampa in modo che txtvenga stampata solo la prima voce anche se ce ne sono diverse come nell'esempio bash.
qqx

2

Esempio: stai cercando il nome del comando del processo associato per PID 45109...

>    % ps awx | awk '$1 == 45109 { print $5 }'
>    /Applications/Safari.app/Contents/MacOS/Safari

2
Non mostrerà il percorso binario completo se il binario è stato avviato solo per nome senza specificare il percorso.
grigoryvp,

non funziona bene, se il percorso contiene spazi bianchi
Peter Lapisu,


1

ps -ef con grep funziona per me. Per un nome file specifico, è sufficiente passare attraverso grep in questo modo:

MacBook:~ Me$ ps -ef | grep Safari | grep -v grep
  501 15733   301   0   0:25.76 ??         1:58.24 /Applications/Safari.app/Contents/MacOS/Safari -psn_0_4977855

(L'ultimo 'grep -v grep' ti impedisce semplicemente di ottenere il tuo comando grep nell'output)


1

ps -p <pid> -Comando

L1A1:~ a1155344$ ps -p1 -Ocommand
  PID   TT  STAT      TIME COMMAND
    1   ??  Ss     0:02.26 /sbin/launchd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.