Wie finde ich die Prozess-ID (PID) eines laufenden Terminalprogramms?

117

Ich starte ein Programm im Terminal, mit dem ich nicht entkommen kann Ctrl- Cund das ich töten möchte. Wie finde ich die PID?

Jjed
quelle
1
Dies ist ein Zweig von Was soll ich tun, wenn Ubuntu einfriert? als Hinweis, um zu verhindern, dass Details in dieser Frage zu technisch werden.
Jjed
Es gibt einen PIDOF- Befehl.
neverMind9

Antworten:

128

Öffnen Sie ein anderes Terminal und führen Sie es aus, ps ax | grep foowobei foo der Name des nicht reagierenden Programms ist. Dies sollte eine Ausgabezeile zurückgeben, die ungefähr so ​​aussieht:

$ ps ax | grep firefox
2222 ?        S      0:00 /bin/sh /usr/lib/firefox-3.6.9/firefox
2231 ?        Sl   514:36 /usr/lib/firefox-3.6.9/firefox-bin
30290 pts/2    S+     0:00 grep --color=auto firefox

Das erste Feld jeder Ausgabezeile ist eine Zahl, die die Prozess-ID des Programms darstellt, zu dem eine Übereinstimmung besteht grep(Sie können die letzte ignorieren, die sich grepselbst darstellt).

kill pidGehen Sie wie folgt vor, um den fehlerhaften Prozess anzuhalten : Dabei steht pid für die Prozess-ID des Programms. Sie müssen möglicherweise Ihr Urteil darüber treffen, welche der Übereinstimmungen bearbeitet werden müssen kill, oder Sie können topstattdessen verwenden. Die Verwendung killvon selbst sendet SIGTERM, das Sie zuerst versuchen sollten, da es dem Programm ermöglicht, ordnungsgemäß nach sich aufzuräumen. Wenn SIGTERM fehlschlägt, versuchen SIGHUP, die stonger Medizin ist: kill -HUP pid. Wenn alles andere fehlschlägt, senden Sie SIGKILL. Sie sollten dies jedoch nur als letzten Ausweg tun, da SIGKILL den Kernel dazu veranlasst, den Prozess sofort abzubrechen, ohne dass eine Bereinigung möglich ist. Dies kann manchmal zu Datenbeschädigungen oder anderen Problemen führen. Senden Sie SIGKILL also nur als letzten Ausweg. Um dies zu tun, tue kill -KILL pidoder kill -9 pid.

Wenn Sie eine grafische Benutzeroberfläche verwenden, müssen Sie sich natürlich nicht mit diesem verrückten Befehlszeilen-Zeugs herumschlagen, um die Arbeit zu erledigen. Öffnen Sie einfach "System Monitor", navigieren Sie zur Registerkarte "Prozesse", wählen Sie den Prozess aus, den Sie anhalten möchten (Hm, könnte dies der Prozess mit 90% CPU sein?), Und klicken Sie mit der rechten Maustaste darauf. Da der Prozess bereits gestoppt ist (das ist das Problem, oder?), Wählen Sie im daraufhin angezeigten Menü Prozess beenden oder Prozess beenden.

Dank an koanhead

Jjed
quelle
5
Menschen sollten niemals SIGKILL (kill -9) verwenden, es sei denn, alle anderen Methoden sind fehlgeschlagen. Nur Auflistung kill -9ist schlechter Rat. Ich habe die Antwort bearbeitet, um sie zu korrigieren.
Scott Severance
Wie finde ich die PID einer benutzerdefinierten Funktion. Ich habe eine Funktion, die eine Schleife mit einem pingBefehl und enthält sleep. Laut unix.stackexchange.com/a/275826/72988 ist dies in Ubuntu ohne nicht möglich multiplexer.
Timo
49

Ich glaube nicht, dass so lange Befehle erforderlich sind, wenn Sie dieselben Befehle mit pgrep, pkill, pidof usw. ausführen können.

  • Um die PID eines Running-Programms zu erhalten

pgrep:

   pgrep [options] pattern

BESCHREIBUNG: pgrep durchsucht die aktuell ausgeführten Prozesse und listet die Prozess-IDs auf, die den Auswahlkriterien für stdout entsprechen. Alle Kriterien müssen übereinstimmen. Zum Beispiel,

  • Um einen Prozess namens sshd zu finden, der root gehört.

    $ pgrep -u root sshd
    
  • Listen Sie die Prozesse auf, die dem Root-OR-Daemon gehören.

    $ pgrep -u root,daemon
    

pidof:

BESCHREIBUNG :

Pidof findet die Prozess-IDs (Pids) der genannten Programme. Diese IDs werden auf der Standardausgabe gedruckt.

Syntax: pidof Programmname

  • Um ein Programm mit pid zu beenden, verwenden Sie das Beispiel pkill:

    pkill pid    
    pkill -f process_name    
    pkill -o process_name    
    pkill -n process_name    
    pkill -l process_name
    

    -fflag: Durchsucht das Flag process_name (siehe man pkill)
    -o: Wählen Sie nur den ältesten der übereinstimmenden Prozesse aus.
    -nflag: Wählen Sie nur den neuesten der übereinstimmenden Prozesse aus.
    -lflag: Listet den Prozessnamen sowie die Prozess-ID auf.

Prabhat Kumar Singh
quelle
1
Dies ist die beste Antwort
BlackDivine
21

Der einfachste Weg, die PID eines laufenden Programms zu ermitteln, ist:

pidof <application name>

Zum Beispiel, wenn Sie vim gestartet haben und dessen pid wissen wollen:

pidof vim

Denken Sie daran, dass Sie den genauen Programmnamen angeben müssen, der gestartet wurde.

Wenn Sie beispielsweise vi ausführen und ausführen, erhalten pidof vimSie keine korrekten Ergebnisse.

pidofWeitere Informationen finden Sie in der Bedienungsanleitung.

Job in
quelle
Dies ist nicht standardmäßig installiert. Möglicherweise ist es im Paket sysvinit-utils enthalten.
Flickerfly
Ich habe MariaDB. pidof mysqldgibt eine PID zurück. Wenn ich jedoch pidof Mariadbnichts eingebe, wird nichts zurückgegeben. Ist es die gleiche PID für MariaDB und MySQL?
Pathros
18

Ich habe festgestellt, dass es nützlich ist, bei der Suche nach Groß- und Kleinschreibung das "-i" einzufügen und "aux" anstelle von "ax" zu verwenden, um eine aussagekräftigere Ausgabe zu erhalten:

ps aux | grep -i firefox

Wenn Sie alle Prozesse beenden möchten, die Sie verwenden können:

ps aux | grep -i firefox | awk {'print $2'} | xargs kill -9

Das ist eine gewaltsame Tötung. Lass die "-9" fallen, wenn du einen Soft Kill willst.

John Foley
quelle
5
Dies bricht auch den ps aux | grep -i firefox...Prozess ab, da dieser den Text firefoxin seinem Befehl enthält!
Eric
1
@Eric Sie könnten verwenden grep -i firefo[x], um nur Firefox entsprechen
AD
@ John-Foley raten nie zur Verwendung -9mit kill, siehe hier für Erklärungen
AD
3

Wenn Sie nur die PID wollen (nützlich für Autokill-Skripte, etc ...)

pgrep -f desired_program_name
MikeL
quelle
1

Für diejenigen , Ubuntu 16.04 LTS läuft, Sie müssen verwenden ps axund nicht nurps in der Befehlszeile, sonst werden Sie nur die Prozesse erhalten aus dem jeweiligen Endgerät Instanz Laichen , die Sie in. ( In der Regel nur ‚bash‘ [die Shell Sie sind in ] und 'ps' [was du gerade gelaufen bist])

cygnus_x1
quelle
Ich mag ps -e(zeigt alles) und ps -ejH(zeigt einen Prozessbaum).
Andrew
1
@ Andrew nett, das ist eigentlich ziemlich süß - danke für den Tipp
cygnus_x1
0

Sie können auch ein anderes Terminal öffnen (oder zu einem anderen Terminal wechseln) und ausführen. Dies topist im Grunde eine Textversion des Systemmonitors. In der ersten Spalte wird die PID jedes laufenden Prozesses aufgeführt. Sie können diese beenden, indem Sie drücken K, die PID eingeben und dann ein zu sendendes numerisches Signal eingeben.

Waldir Leoncio
quelle
0

Du könntest es tun:

ps ax | grep firefox | cut -f2 -d" " - | xargs kill -9

Die ersten beiden Pipes erhalten Prozessinformationen. Als Nächstes versuchen wir, die PID-Spalte mithilfe des Old-School-Schnitts zu ermitteln. Anschließend geben wir die resultierende PID zum Töten an.

Arian Soltani
quelle
kill -9ist die größte Waffe, die Sie einen Prozess töten müssen. Sie sollten zunächst ein sanfteres Signal versuchen, bevor Sie auf SIGKILL zurückgreifen, um dem Prozess die Möglichkeit zu geben, seine Ressourcen zu bereinigen.
Byte Commander
Das ist wahr @ByteCommander. Ich wollte es zu einem Einzeiler machen, der die Arbeit erledigt.
Arian Soltani
0
top

oder

screen -list|ls

liste alle pid mit dem entsprechenden prozess auf

kill -[pid]
Rakly3
quelle