Wie erhalte ich die Prozess-ID, um einen Nohup-Prozess abzubrechen?


203

Ich führe einen Nohup-Prozess auf dem Server aus. Wenn ich versuche, es zu töten, schließt sich stattdessen meine Kittkonsole.

So versuche ich, die Prozess-ID zu finden:

ps -ef |grep nohup 

Dies ist der Befehl zum Töten

 kill -9 1787 787

6
Versuchen Sie, es über ein Skript oder über die Befehlszeile zu beenden? Sie müssen entweder die PID speichern, wenn Sie dies tun, nohupund sie später für die verwenden kill, oder Sie müssen den Prozess anhand seines Befehlsnamens in der ps -efAusgabe suchen und die PID daraus abrufen. Sie müssen nach dem Befehlsnamen suchen, nicht nohup.
Lurker

1
@mbratch Du solltest das eine Antwort anstelle eines Kommentars machen.
Ansgar Wiechers

@AnsgarWiechers danke für den Vorschlag. Manchmal, wenn meine Antwort sehr kurz ist oder wenn ich nicht sicher bin, ob sie die Anforderungen des OP vollständig abdeckt, zögere ich, sie als Antwort zu veröffentlichen. Ich habe eine Antwort hinzugefügt und weitere Informationen hinzugefügt.
Lurker

Antworten:


352

Wenn nohupSie die Aufgabe verwenden und in den Hintergrund stellen, &gibt Ihnen der Hintergrundoperator ( ) an der Eingabeaufforderung die PID. Wenn Sie den Prozess manuell verwalten möchten, können Sie diese PID speichern und später verwenden, um den Prozess bei Bedarf über kill PIDoder kill -9 PID(wenn Sie das Beenden erzwingen müssen) abzubrechen. Alternativ können Sie die PID später bei finden ps -ef | grep "command name"und die PID von dort aus suchen . Beachten Sie, dass das nohupSchlüsselwort / der Befehl selbst nicht in der psAusgabe des betreffenden Befehls angezeigt wird.

Wenn Sie ein Skript verwenden, können Sie Folgendes tun:

nohup my_command > my.log 2>&1 &
echo $! > save_pid.txt

Dadurch wird die my_commandgesamte Ausgabe gespeichert my.log(in einem Skript wird $!die PID des zuletzt ausgeführten Prozesses dargestellt). Dies 2ist der Dateideskriptor für Standardfehler ( stderr) und 2>&1weist die Shell an, die Standardfehlerausgabe an die Standardausgabe (Dateideskriptor) weiterzuleiten 1. Dies erfordert &1, dass die Shell weiß, dass es sich in diesem Kontext um einen Dateideskriptor handelt und nicht nur um eine Datei mit dem Namen 1. Das 2>&1wird benötigt, um alle Fehlermeldungen, die normalerweise als Standardfehler geschrieben werden, in unsere my.logDatei (die aus der Standardausgabe stammt) zu erfassen . Siehe I / O - Umleitung , um weitere Informationen über den Umgang mit E / A - Umleitung mit der Schale.

Wenn der Befehl regelmäßig eine Ausgabe sendet, können Sie die Ausgabe gelegentlich mit überprüfen tail my.log, oder wenn Sie sie "live" verfolgen möchten, können Sie sie verwenden tail -f my.log. Wenn Sie den Prozess beenden müssen, können Sie dies über Folgendes tun:

kill -9 `cat save_pid.txt`
rm save_pid.txt

15
Eine leichte Klarstellung, es ist nicht nohupper se, dass die PID gedruckt wird, es ist das Finale, &welche Hintergründe es, z. B. ls &würde die PID für das Laufen zeigenls
Karmakaze

1
Was macht die '2> & 1'?
Viraj

4
@Viraj 2ist der Dateideskriptor "Standardfehler". >ist die Shell-Umleitung und &1der "Standardausgabe" -Dateideskriptor (der &hier benötigt wird, damit die Shell nicht glaubt, dass ich mich auf eine Datei mit dem Namen beziehe 1). So 2 > &1leitet beliebige Standard - Fehlerausgabe an die Standardeingabe. Da das vorherige > my.logMittel zum Umleiten der Standardausgabe verwendet wird, my.logmüssen wir sicherstellen, dass auch Fehlermeldungen angezeigt werden my.log. 2 > &1stellt sicher, dass solche Fehler an die Standardausgabe gehen, die wiederum an geht my.log. Siehe E / A-Umleitung .
Lurker

6
echo $!gibt mir die pid von nohup anstelle des Prozesses, der erzeugt wurde: paste.fedoraproject.org/428697/99695314
Nehal J Wani

1
@Mvorisek &fungiert als Befehlsbegrenzer, sodass Sie versuchen können , sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt". Es könnte funktionieren, aber ich habe es nicht versucht.
Lurker

91

Ich verwende Red Hat Linux auf einem VPS-Server (und über SSH-Putty). Für mich hat Folgendes funktioniert:

Zunächst listen Sie alle laufenden Prozesse auf:

ps -ef

Dann finden Sie in der ersten Spalte Ihren Benutzernamen; Ich habe es dreimal gefunden:

  • Eine war die SSH-Verbindung
  • Die zweite war eine FTP-Verbindung
  • Der letzte war der Nohup-Prozess

Dann finden Sie in der zweiten Spalte die PID des Nohup-Prozesses und geben nur Folgendes ein:

kill PID 

(Ersetzen der PID durch die PID des Nohup-Prozesses natürlich)

Und das ist alles!

Ich hoffe, diese Antwort ist nützlich für jemanden, der noch sehr neu in Bash und SSH ist, aber 95% des Wissens gefunden hat, das ich hier brauche :)


3
Ich denke du meintest hier PID statt UID?
wprins

Ich stimme @wprins zu. Das Töten der UID hat bei mir nicht funktioniert, das Töten der PID jedoch.
Ryan

In meinem Fall habe ich ein Test-Shell-Skript (long_running_script.sh) mit nohup und & ausgeführt und weiß nicht, wie ich es stoppen kann. Schließlich habe ich ein ps -ef | gemacht grep long_running * und fouund die PID. Dann hat ein Kill PID
Rennish Joseph

50

Angenommen, ich führe ein Ruby-Skript im Hintergrund mit dem folgenden Befehl aus

nohup ruby script.rb &

Dann kann ich die PID des obigen Hintergrundprozesses durch Angabe des Befehlsnamens erhalten. In meinem Fall ist Befehl Ruby.

ps -ef | grep ruby

Ausgabe

ubuntu   25938 25742  0 05:16 pts/0    00:00:00 ruby test.rb

Jetzt können Sie den Prozess einfach mit dem Befehl kill beenden

kill 25938

1
Sanjay, nur damit ich sicher bin, dass mir nichts fehlt, welcher Teil Ihrer Antwort ist neu oder unterscheidet sich von den Antworten, die vor Jahren gegeben wurden? ps -efund killwaren beide oben gut abgedeckt, also was ist der neue Teil?
David C. Rankin

2
ps -ef gibt Ihnen die lange Liste der Ausgaben und die Suche aus dieser langen Liste wird schwierig sein. also ich denke ps -ef | grep ruby ​​ist ein besserer Befehl, um pid zu suchen, als nur ps -ef zu tun
Sanjay Salunkhe

20

jobs -l sollte Ihnen die PID für die Liste der Nohup-Prozesse geben. töte sie sanft (-9). ;)


11
Nur wenn der Job in der aktuellen Shell gestartet wurde. Und nicht, kill -9wenn Sie nicht wissen, dass reguläre Signale nicht funktionieren.
Tripleee

1
Dies ist nützlich, wenn Sie sich auf einem Docker-Image befinden, auf dem ps nicht installiert ist :-)
Andreas Profous

5

Du könntest es versuchen

kill -9 `pgrep [command name]`

2
Sehr schön! Ich habe verwendet, dass pkill [command name]Sie das -oFlag verwenden können, um den ältesten Übereinstimmungsprozess zu beenden oder -nstattdessen den neuesten zu verwenden.
Zanona

4

Das funktioniert in Ubuntu

Geben Sie dies ein, um das herauszufinden PID

ps aux | grep java

Der gesamte laufende Prozess in Bezug auf Java wird angezeigt

In meinem Fall ist

johnjoe      3315  9.1  4.0 1465240 335728 ?      Sl   09:42   3:19 java -jar batch.jar

Jetzt töte es kill -9 3315

Der Zombie-Prozess wurde schließlich gestoppt.


4

Angenommen, Sie führen ein Java-Programm mit nohup aus, mit dem Sie die Java-Prozess-ID abrufen können

`ps aux | grep java`

Ausgabe

xxxxx     9643  0.0  0.0  14232   968 pts/2   

Dann können Sie den Vorgang durch Eingabe beenden

sudo kill 9643

oder nehmen wir an, Sie müssen alle Java-Prozesse beenden und dann einfach verwenden

sudo killall java

Dieser Befehl beendet alle Java-Prozessoren. Sie können dies mit Prozess verwenden. Geben Sie einfach den Prozessnamen am Ende des Befehls ein

sudo killall {processName}

2

Wenn Sie einen Job in nohup erstellen, wird Ihnen die Prozess-ID angezeigt!

nohup sh test.sh &

Die Ausgabe zeigt Ihnen die Prozess-ID wie

25013

Sie können es dann töten:

kill 25013

1

Ich habe den Django-Server mit dem folgenden Befehl gestartet.

nohup manage.py runserver <localhost:port>

Dies funktioniert unter CentOS:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 

Dies ist der process not foundrichtige Weg, um die Verwirrung mit nohup zu lösen .
CodeSpent

0

Heute bin ich auf das gleiche Problem gestoßen. Und da es schon lange her ist, habe ich völlig vergessen, welchen Befehl ich wann verwendet habe. Ich habe drei Methoden ausprobiert:

  1. Verwenden Sie die STIME in ps -ef Befehl . Dies zeigt die Zeit an, zu der Sie Ihren Prozess starten, und es ist sehr wahrscheinlich, dass Sie nicht befehlen, kurz bevor Sie ssh schließen (hängt von Ihnen ab). Leider glaube ich nicht, dass der neueste Befehl der Befehl ist, den ich mit nohup ausführe, daher funktioniert dies bei mir nicht.
  2. Zweitens ist die PPID, die auch im ps -efBefehl angezeigt wird . Dies bedeutet übergeordnete Prozess-ID, die ID des Prozesses, der den Prozess erstellt. Die ppid ist 1 in Ubuntu für Prozesse, die nohup zum Ausführen verwenden. Anschließend können Sie ps --ppid "1"die Liste abrufen und TIME (die gesamte CPU-Zeit, die Ihr Prozess verwendet) oder CMD überprüfen, um die PID des Prozesses zu ermitteln.
  3. Verwenden Sie lsof -i:portdiese Option, wenn der Prozess einige Ports belegt und Sie den Befehl erhalten. Verwenden ps -ef | grep commandSie dann genau wie in der obigen Antwort und Sie erhalten die PID.

Sobald Sie die PID des Prozesses gefunden haben, können Sie kill pidden Prozess beenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.