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:
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:
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 .
@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 :)
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.
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). ;)
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
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:
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.
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.
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.
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
.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 überkill PID
oderkill -9 PID
(wenn Sie das Beenden erzwingen müssen) abzubrechen. Alternativ können Sie die PID später bei findenps -ef | grep "command name"
und die PID von dort aus suchen . Beachten Sie, dass dasnohup
Schlüsselwort / der Befehl selbst nicht in derps
Ausgabe des betreffenden Befehls angezeigt wird.Wenn Sie ein Skript verwenden, können Sie Folgendes tun:
Dadurch wird die
my_command
gesamte Ausgabe gespeichertmy.log
(in einem Skript wird$!
die PID des zuletzt ausgeführten Prozesses dargestellt). Dies2
ist der Dateideskriptor für Standardfehler (stderr
) und2>&1
weist die Shell an, die Standardfehlerausgabe an die Standardausgabe (Dateideskriptor) weiterzuleiten1
. 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 Namen1
. Das2>&1
wird benötigt, um alle Fehlermeldungen, die normalerweise als Standardfehler geschrieben werden, in unseremy.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 verwendentail -f my.log
. Wenn Sie den Prozess beenden müssen, können Sie dies über Folgendes tun:quelle
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 beziehe1
). So2 > &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 werdenmy.log
.2 > &1
stellt sicher, dass solche Fehler an die Standardausgabe gehen, die wiederum an gehtmy.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:
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:
(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 :)
quelle
Angenommen, ich führe ein Ruby-Skript im Hintergrund mit dem folgenden Befehl aus
Dann kann ich die PID des obigen Hintergrundprozesses durch Angabe des Befehlsnamens erhalten. In meinem Fall ist Befehl Ruby.
Ausgabe
Jetzt können Sie den Prozess einfach mit dem Befehl kill beenden
quelle
ps -ef
undkill
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). ;)
quelle
kill -9
wenn Sie nicht wissen, dass reguläre Signale nicht funktionieren.Du könntest es versuchen
quelle
pkill [command name]
Sie das-o
Flag verwenden können, um den ältesten Übereinstimmungsprozess zu beenden oder-n
stattdessen den neuesten zu verwenden.Das funktioniert in
Ubuntu
Geben Sie dies ein, um das herauszufinden
PID
Der gesamte laufende Prozess in Bezug auf Java wird angezeigt
In meinem Fall ist
Jetzt töte es
kill -9 3315
Der Zombie-Prozess wurde schließlich gestoppt.
quelle
Angenommen, Sie führen ein Java-Programm mit nohup aus, mit dem Sie die Java-Prozess-ID abrufen können
Ausgabe
Dann können Sie den Vorgang durch Eingabe beenden
oder nehmen wir an, Sie müssen alle Java-Prozesse beenden und dann einfach verwenden
Dieser Befehl beendet alle Java-Prozessoren. Sie können dies mit Prozess verwenden. Geben Sie einfach den Prozessnamen am Ende des Befehls ein
quelle
Wenn Sie einen Job in nohup erstellen, wird Ihnen die Prozess-ID angezeigt!
Die Ausgabe zeigt Ihnen die Prozess-ID wie
Sie können es dann töten:
quelle
Ich habe den Django-Server mit dem folgenden Befehl gestartet.
Dies funktioniert unter CentOS:
quelle
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 Sieps --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. Verwendenps -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.quelle