2013-03-21 12 views
21

Come ottenere un nome di processo dal suo pid? Ad esempio eseguo cat file1.txt, ma voglio capire quel comando cat e i suoi argomenti dal suo pid nel sistema. C'è una struttura per determinarlo o qualcosa di simile? Qualche idea?Nome processo dal suo pid in linux

+1

possibile duplicato di [Ottieni nome processo per PID] (http://stackoverflow.com/questions/4189717/get-process-name-by-pid) – Hasturkun

risposta

22

Non esiste un modo generale per eseguire questo unix.
Ogni SO ha diversi modi per gestirlo e alcuni sono molto difficili. Si parla di Linux però. Con Linux, le informazioni sono nel filesystem/proc.
Per ottenere la riga di comando per ID processo 9999, leggere il file /proc/9999/cmdline.

+10

E per ottenere il nome processo per ID processo 9999, leggere il file '/ proc/9999/comm'. –

+1

La domanda era come ottenere il nome del processo, non la riga di comando. Sul mio SUSE inserisco 'head/proc/9999/cmdline' per un processo kwrite e restituisce: 'kdeinit4: kwrite [kdeinit]'. Se uso/comm invece di/cmdline ottengo il risultato corretto: 'kwrite'. – Elmue

13

Su linux, è possibile cercare in . Prova a digitare man proc per ulteriori informazioni. Il contenuto di /proc/$PID/cmdline fornirà la riga di comando con cui è stato eseguito il processo $PID. C'è anche /proc/self per esaminare te stesso :)

Un'alternativa (ad esempio su Mac OS X) è utilizzare libproc. Vedi libproc.h.

+0

Puoi dirmi la differenza tra la tua risposta e la mia? :) – Anubhab

+9

La tua risposta non era lì quando ho iniziato a scrivere la mia :) –

+0

HAHAHA ..: D .... – Anubhab

8

POSIX C NON supporta un'API standard per ottenere il nome del processo tramite PID.

In Linux, è possibile ottenere il nome dall'API LINUX Proc:/proc/$ PID/cmdline. E il codice appare come questi:

const char* get_process_name_by_pid(const int pid) 
{ 
    char* name = (char*)calloc(1024,sizeof(char)); 
    if(name){ 
     sprintf(name, "/proc/%d/cmdline",pid); 
     FILE* f = fopen(name,"r"); 
     if(f){ 
      size_t size; 
      size = fread(name, sizeof(char), 1024, f); 
      if(size>0){ 
       if('\n'==name[size-1]) 
        name[size-1]='\0'; 
      } 
      fclose(f); 
     } 
    } 
    return name; 
} 
+1

E se siete venuti qui alla ricerca di un soluzione in C# che funziona con mono, quindi dai un'occhiata a questo: http://stackoverflow.com/questions/29827331/workaround-for-bug-in-mono-wrong-process-processname-solved – Elmue

6

per ottenere il nome di un processo id processo dire 9000 l'uso di questo comando:

ps -p 9000 -o comm= 
2

Anche se questa domanda è stato risposto, vorrei aggiungere la mia 2 centesimi.

Nel mio caso, quando il processo 1111 crea 22222 processo tramite il tubo (almeno questo è quello che ho sentito),/proc/2222/cmdline non dà nome corretto processo, ma invece dà qualcosa come 1111_1. Devo usare/proc/2222/comm per ottenere il nome del processo corretto.