Wenn ich die PID-Nummer eines Prozesses kenne, wie kann ich seinen Namen erhalten?

263

Wie kann ich den Namen des zugeordneten Prozesses ermitteln, wenn ich die PID-Nummer für einen Prozess (auf einem UNIX-Computer) habe?

Was muss ich tun?

AndreaNobili
quelle
9
Sie können psoderls -l /proc/$PID/exe
Eddy_Em
1
@Eddy_Em gibt Ihnen die ausführbare Datei, die nicht immer der Prozessname ist. Auch das ist nicht tragbar ...
Derobert
9
ps -fp PIDwird das volle Kommando zeigen
Temak

Antworten:

284

Auf allen POSIX-kompatiblen Systemen und unter Linux können Sie Folgendes verwenden ps:

ps -p 1337 -o comm=

Hier wird der Prozess durch seine PID mit ausgewählt -p. Die -oOption gibt das Ausgabeformat an, commdh den Befehlsnamen.

Siehe auch: ps- The Open Group Base Specifications Issue 6

slhck
quelle
28
comm scheint den Befehl auf 15 Zeichen zu kürzen. Verwenden Sie commandstattdessen, um das Problem zu beheben.
Nemo
1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= init $ ps -p 1 -o command= / sbin / init; Das bedeutet, dass es sich nicht um 15 Zeichen handelt, sondern nur um den Namen der Binärdatei im Vergleich zum vollständigen Pfad.
OmarOthman
3
Eigentlich commgibt den Namen der binären und commandkehrt Argument 0
robbie
45

Sie finden den Prozessnamen oder den Befehl, der von der Prozess-ID oder der PID von verwendet wird

/proc/pid/cmdline

indem du tust

cat /proc/pid/cmdline

Hier pid ist die pid, für die Sie den Namen finden möchten.
Zum Beispiel:

 # ps aux

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

Um den von pid 2480 verwendeten Prozessnamen zu finden, können Sie can verwenden

# cat /proc/2480/cmdline 

 gnome-terminal
Stormvirux
quelle
14
Achtung: Das OP erwähnt UNIX. Nicht alle UNIX-Systeme implementieren Plan 9 wie prozessspezifische Dateien. Ihre Antwort gilt im Allgemeinen nur für Linux.
Slhck
3
Während das stimmt, haben sie die Frage "Linux" getaggt. Jeder, der ein nicht auf Linux basierendes UNIX-Betriebssystem verwendet, ist es gewohnt, die Antworten an seine Bedürfnisse anzupassen
Andrew White,
14

Um den Pfad des Programms unter Verwendung einer bestimmten PID zu ermitteln, können Sie Folgendes verwenden:

ps ax|egrep "^ [PID]"

alternativ können Sie verwenden:

ps -a [PID]

Bildbeschreibung hier eingeben

Pedro Lobito
quelle
1
ps -aliste alle Prozesse auf, die dem Terminal zugeordnet sind, es werden keine Eingaben gemacht.
Michael Lee
@MichaelLee Ich denke, es hängt von der psVersion ab, procps version 3.2.7funktioniert gut.
Pedro Lobito
8
# ls -la /proc/ID_GOES_HERE/exe

Beispiel:

# ls -la /proc/1374/exe
lrwxrwxrwx 1 chmm chmm 0 Mai  5 20:46 /proc/1374/exe -> /usr/bin/telegram-desktop
Carlos HM Moreira
quelle
Dieser ist perfekt.
Jayarjo
1
Wahrscheinlich besser: readlink /proc/1337/exe. readlink - druckt aufgelöste symbolische Links oder kanonische Dateinamen.
Pablo A
8

Sie können pmap verwenden. Ich suche nach PID 6649. Und schneide die zusätzlichen Prozessdetails ab.

$ pmap 6649 | head -1
6649:   /usr/lib64/firefox/firefox
Mike Studer
quelle
Dieser Befehl hat mir mehr geholfen, als ich brauchte. Ich habe die vollständige Übersicht über den Prozess, der gestartet wurde. Bei einem Java-Prozess wird mit dem psBefehl nur ein Punkt javaangezeigt, der Rest der übergebenen Parameter wird jedoch vollständig mit angezeigt pmap.
Daniel Andrei Mincă
3

Sie können awk auch in Kombination mit ps verwenden

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

Beispiel:

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

HEAD LINE können Sie drucken

 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
Gangadhar
quelle
2
Dies ist instabil, da auch Prozesse ausgewählt werden, die die Nummer an einer beliebigen Stelle in ihrem Befehl enthalten. Überprüfen ps ax | grep 1Sie beispielsweise, ob der initProzess tatsächlich zurückgegeben wird. (In meinem Fall werden 119 Zeilen zurückgegeben - nicht wünschenswert.)
slhck
1
@slhck Die Antwort wurde geändert ... Danke für die Info. ps -p 1 -o comm = ist die beste Option für diese Frage.
Gangadhar
Wir brauchen nicht zwei Läufe, um Header beizubehalten, sondern verwenden ps aux | awk 'NR==1 || $2==PID'- und müssen nicht sagen, {print $0}weil es die Standardeinstellung ist. Aber wie du kommentiert hast, -pist es sowieso besser.
Dave_thompson_085
3

Ähnlich wie die Antwort von slhck , jedoch unter Verwendung von Dateioperationen anstelle von Befehlsaufrufen:

MYPID=1
cat "/proc/$MYPID/comm"
ThorSummoner
quelle
[Ubuntu 14.04.4 LTS] cat /proc/1/comm=> init, nicht / sbin / init. In seiner Antwort ist die längere Version enthalten. Aber trotzdem +1.
OmarOthman
2

Überraschenderweise hat niemand die Option -f (vollständiger Befehl) für ps erwähnt. Ich verwende es gerne mit -e (alles) und leite die Ergebnisse an grep weiter, damit ich meine Suche eingrenzen kann.

ps -ef | grep <PID>

Dies ist auch sehr nützlich, um vollständige Befehle anzuzeigen, die von jemandem ausgeführt werden, der viele Ressourcen auf Ihrem System beansprucht. Dies zeigt Ihnen die Optionen und Argumente, die an den Befehl übergeben wurden.

jdelaporte
quelle
3
Funktioniert nicht mit BSD (vielleicht auch mit MacOSX? Ich bin mir nicht sicher). Auch wenn -e -fverfügbar, grepkönnen viele falsche Übereinstimmungen erzeugt werden, z. B. grep 33pid = 933 oder 339, ppid = 33 oder 933 oder 339, 33 Sekunden oder 33 Minuten verwendete Zeit oder Programmname oder Argument mit 33 - einschließlich der grepselbst. Alle (AFAIK) pshaben -p, also einfach ps -fp 33.
Dave_thompson_085
0

Ich finde die einfachste Methode, um mit dem folgenden Befehl zu sein:

ps -awxs | grep pid
user666282
quelle
Abgesehen davon, dass ps -p${pid}dies im Vergleich zu hochgradig ineffizient ist, wird dies eine Vielzahl von Fehlalarmen auffangen - einschließlich der grepselbst.
Toby Speight
0

hat ein einfaches Skript erstellt, um PID zu finden und in Bash-Skripten zu verwenden ...
mit Vorsicht zu verwenden !!

Screenshot: http://pastebin.com/Cm9YH67U
Bildschirmfoto



André

André Verwijs
quelle