Se conosco il numero PID di un processo, come posso ottenere il suo nome?


263

Se ho il numero PID per un processo (su una macchina UNIX), come posso scoprire il nome del processo associato?

Cosa devo fare?


9
Puoi usare psols -l /proc/$PID/exe
Eddy_Em

1
@Eddy_Em che ti darà il file eseguibile, che non è sempre il nome del processo. Inoltre, non è portatile ...
derobert il

9
ps -fp PIDmostrerà il comando completo
Temak il

Risposte:


284

Su tutti i sistemi compatibili con POSIX e con Linux, è possibile utilizzare ps:

ps -p 1337 -o comm=

Qui, il processo è selezionato dal suo PID con -p. L' -oopzione specifica il formato di output, commovvero il nome del comando.

Vedi anche: ps- Le specifiche Open Group Base Numero 6


28
comm sembra troncare il comando a 15 caratteri. L'uso commandinvece lo risolve.
Nemo,

1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= init $ ps -p 1 -o command= / sbin / init; il che significa che non ha circa 15 caratteri, forse solo il nome del binario rispetto al suo percorso completo.
OmarOthman,

3
In realtà, commdà il nome del binario e commandrestituisce l'argomento 0
robbie

45

È possibile trovare il nome del processo o il comando utilizzato dall'ID processo o dal pid

/proc/pid/cmdline

facendo

cat /proc/pid/cmdline

Qui pid è il pid per cui si desidera trovare il nome
per exmaple:

 # ps aux

   ................
   ................
   user  2480  0.0  1.2 119100 12728 pts/0  Sl   22:42   0:01 gnome-terminal
   ................
   ................

Per trovare il nome del processo usato da pid 2480 che usi can

# cat /proc/2480/cmdline 

 gnome-terminal

14
Attenzione: il PO menziona UNIX. Non tutti gli UNIX implementano il file specifico del processo di Plan 9. La tua risposta generalmente si applica solo a Linux.
slhck,

3
Anche se questo è vero, hanno taggato la domanda "linux". Chiunque utilizzi un sistema operativo UNIX non basato su Linux sarà abbastanza abituato a dover modificare le risposte per soddisfare le proprie esigenze
Andrew White,

14

Per ottenere il percorso del programma usando un certo pid puoi usare:

ps ax|egrep "^ [PID]"

in alternativa puoi usare:

ps -a [PID]

inserisci qui la descrizione dell'immagine


1
ps -aelenca tutti i processi associati al terminale, non richiede alcun input.
Michael Lee

@MichaelLee Immagino che dipenda dalla psversione, dalle procps version 3.2.7opere a posto.
Pedro Lobito,

8
# ls -la /proc/ID_GOES_HERE/exe

Esempio:

# ls -la /proc/1374/exe
lrwxrwxrwx 1 chmm chmm 0 Mai  5 20:46 /proc/1374/exe -> /usr/bin/telegram-desktop

Questo è perfetto
jayarjo,

1
Probabilmente meglio: readlink /proc/1337/exe. readlink - stampa collegamenti simbolici risolti o nomi di file canonici.
Pablo A

8

Puoi usare pmap. Sto cercando PID 6649. E tagliando i dettagli del processo extra.

$ pmap 6649 | head -1
6649:   /usr/lib64/firefox/firefox

Questo comando mi ha aiutato più del necessario, ho la linea completa del processo avviato. Dato un processo Java, con il pscomando tutto ciò che vedrai sarà giusto java, ma il resto dei parametri passati verrà visualizzato completamente con pmap.
Daniel Andrei Mincă,

3

Puoi anche usare awk in combinazione con ps

ps aux | awk '$2 == PID number for a process  { print $0 }'

esempio:

root@cprogrammer:~# ps aux | awk '$2 == 1 { print $0 }'
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init    

per stampare HEAD LINE che puoi usare

 ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'

                 (or) 

 ps --headers aux |head -n 1; ps aux | awk '$2 == 1 { print $0 }'


root@cprogrammer:~# ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init

2
Questo è instabile poiché selezionerebbe anche i processi che includono il numero in qualsiasi punto del loro comando. Prova a ps ax | grep 1vedere se restituisce davvero il initprocesso, ad esempio. (Nel mio caso, restituisce 119 righe - non desiderabile.)
slhck

1
@slhck Modificata la risposta ... grazie per le informazioni .. ps -p 1 -o comm = è l'opzione migliore per questa domanda.
Gangadhar,

Non abbiamo bisogno di due esecuzioni per conservare le intestazioni, invece usiamo ps aux | awk 'NR==1 || $2==PID'- e non c'è bisogno di dire {print $0}perché è l'impostazione predefinita. Ma come hai commentato, -pè comunque meglio.
dave_thompson_085,

3

Simile alla risposta di slhck , ma basandosi sulle operazioni sui file anziché sulle chiamate ai comandi:

MYPID=1
cat "/proc/$MYPID/comm"

[Ubuntu 14.04.4 LTS] cat /proc/1/comm=> init, non / sbin / init. La sua risposta include la versione più lunga. Ma +1 comunque.
OmarOthman,

2

Sorprendentemente, nessuno ha menzionato l'opzione -f (comando completo) per ps. Mi piace usarlo con -e (tutto) e convogliare i risultati in grep in modo da poter restringere la mia ricerca.

ps -ef | grep <PID>

Questo è anche molto utile per guardare i comandi completi che qualcuno sta eseguendo e che stanno prendendo molte risorse sul tuo sistema. Questo ti mostrerà le opzioni e gli argomenti passati al comando.


3
Non funziona su BSD (forse incluso MacOSX? Non ne sono sicuro). Anche dove -e -fsono disponibili, greppuò produrre molte false corrispondenze, ad esempio grep 33include pid = 933 o 339, ppid = 33 o 933 o 339, tempo di 33 secondi o 33 minuti, o nome programma o argomento contenente 33 - incluso lo grepstesso. Tutti (AFAIK) pshanno -p, quindi solo ps -fp 33.
dave_thompson_085

0

Trovo che il metodo più semplice sia con il seguente comando:

ps -awxs | grep pid

Oltre ad essere altamente inefficiente rispetto a ps -p${pid}, questo raccoglierà molti falsi positivi - incluso lo grepstesso.
Toby Speight,

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.