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
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
Antworten:
Wenn nohup
Sie 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 PID
oder 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 nohup
Schlüsselwort / der Befehl selbst nicht in der ps
Ausgabe 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_command
gesamte Ausgabe gespeichert my.log
(in einem Skript wird $!
die PID des zuletzt ausgeführten Prozesses dargestellt). Dies 2
ist der Dateideskriptor für Standardfehler ( stderr
) und 2>&1
weist 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>&1
wird benötigt, um alle Fehlermeldungen, die normalerweise als Standardfehler geschrieben werden, in unsere my.log
Datei (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
nohup
per 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
2
ist der Dateideskriptor "Standardfehler". >
ist die Shell-Umleitung und &1
der "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 > &1
leitet beliebige Standard - Fehlerausgabe an die Standardeingabe. Da das vorherige > my.log
Mittel zum Umleiten der Standardausgabe verwendet wird, my.log
müssen wir sicherstellen, dass auch Fehlermeldungen angezeigt werden my.log
. 2 > &1
stellt sicher, dass solche Fehler an die Standardausgabe gehen, die wiederum an geht my.log
. Siehe E / A-Umleitung .
echo $!
gibt mir die pid von nohup anstelle des Prozesses, der erzeugt wurde: paste.fedoraproject.org/428697/99695314
&
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.
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:
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 :)
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
ps -ef
und kill
waren beide oben gut abgedeckt, also was ist der neue Teil?
jobs -l sollte Ihnen die PID für die Liste der Nohup-Prozesse geben. töte sie sanft (-9). ;)
kill -9
wenn Sie nicht wissen, dass reguläre Signale nicht funktionieren.
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.
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}
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
process not found
richtige Weg, um die Verwirrung mit nohup zu lösen .
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:
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.ps -ef
Befehl 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.lsof -i:port
diese Option, wenn der Prozess einige Ports belegt und Sie den Befehl erhalten. Verwenden ps -ef | grep command
Sie dann genau wie in der obigen Antwort und Sie erhalten die PID.Sobald Sie die PID des Prozesses gefunden haben, können Sie kill pid
den Prozess beenden.
nohup
und sie später für die verwendenkill
, oder Sie müssen den Prozess anhand seines Befehlsnamens in derps -ef
Ausgabe suchen und die PID daraus abrufen. Sie müssen nach dem Befehlsnamen suchen, nichtnohup
.