Wie kann ich einen Hintergrundprozess beenden?

196

Ich habe ein Wget auf einem entfernten Rechner im Hintergrund mit gestartet &. Plötzlich hört der Download auf. Ich möchte den Prozess beenden und dann den Befehl erneut ausführen. Wie kann ich es kündigen?

Ich habe das Muschelfenster nicht geschlossen. Aber wie Sie wissen, hört die Verwendung von Ctrl+ Cund Ctrl+ nicht auf Z.

Mohammad Etemaddar
quelle

Antworten:

256

Hierfür gibt es viele Möglichkeiten.

Methode 1 - ps

Sie können den psBefehl verwenden, um die Prozess-ID für diesen Prozess zu ermitteln und anschließend den Prozess mithilfe der PID abzubrechen.

Beispiel

$ ps -eaf | grep [w]get 
saml      1713  1709  0 Dec10 pts/0    00:00:00 wget ...

$ kill 1713

Methode 2 - pgrep

Sie finden die Prozess-ID auch über pgrep.

Beispiel

$ pgrep wget
1234

$ kill 1234

Methode 3 - pkill

Wenn Sie sicher sind, dass es das einzige ist, das wgetSie ausgeführt haben, können Sie pkillden Auftrag mit dem Befehl namentlich beenden.

Beispiel

$ pkill wget

Methode 4 - Jobs

Wenn Sie sich in derselben Shell befinden, von der aus Sie den Job ausgeführt haben, der jetzt im Hintergrund ausgeführt wird. Sie können mit dem jobsBefehl überprüfen, ob er noch ausgeführt wird, und ihn anhand seiner Auftragsnummer beenden.

Beispiel

Mein falscher Job sleep.

$ sleep 100 &
[1] 4542

Finde die Jobnummer. HINWEIS: Die Nummer 4542 ist die Prozess-ID.

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

Methode # 5 - fg

Mit dem fgBefehl können Sie einen Hintergrundjob wieder in den Vordergrund bringen .

Beispiel

Falscher Job sleep.

$ sleep 100 &
[1] 4650

Holen Sie sich die Nummer des Jobs.

$ jobs
[1]+  Running                 sleep 100 &

Bringen Sie Job 1 wieder in den Vordergrund und verwenden Sie dann Ctrl+ C.

$ fg 1
sleep 100
^C
$
slm
quelle
Das jobshat keine outputund fg sais: -bash: fg: 1: no such job. Aber das Tippen fgfunktioniert gut und pkill wgetfunktioniert auch gut. aber ps -eaf|grep wgetund dann kill <process number>nicht aufhören zu arbeiten. ps: ich benutze die dritte nummer als prozessnummer .
Mohammad Etemaddar
1
@MohammadEtemaddar - benutze die 2. Nummer aus der Ausgabe von ps. Die 3. # ist die Prozess-ID des übergeordneten Elements.
slm
1
@ MohammadEtemaddar - ah, die ps findet das grep. Machen Sie es wie folgt aus : ps -eaef| grep [w]get.
slm
1
@MohammadEtemaddar - Sie können auch verwenden pgrepstattdessen pgrep wget.
slm
2
@ MohammadEtemaddar - Entschuldigung, das Extra e ist ein Tippfehler. Sollte lesen ps -eaf | grep [w]get. Die Optionen finden Sie auf der psManpage. man ps.
slm
70

In Bash können Sie verwenden fg, um den Job in den Vordergrund zu bringen und dann Ctrl+ zu verwendenC

Oder listen Sie den Vorgang im Hintergrund mit jobsund dann mit auf

kill %1

(wobei 1 durch die Zahl ersetzt wurde, die jobsSie erhalten haben)

Zelda
quelle
13

Sie können auch verwenden kill $!, um den zuletzt im Hintergrund ausgeführten Job zu beenden.

tek0078
quelle
Wenn es als Befehl wie ein Alias ​​in einem Bash-Profil verwendet wird, müssen Sie es in einfache Anführungszeichen setzen.
Nate Ritter
6

BEARBEITEN: Sobald Sie im Vordergrund sind, können Sie Ctrl+ Coder, wie bei @Zelda erwähnt, mit '% x' töten, wobei 'x' die Auftragsnummer ist, die das Standardsignal sendet (höchstwahrscheinlich SIGTERM im Fall von Linux).

fgGeben Sie einfach ein , um es in den Vordergrund zu bringen, wenn es der letzte Prozess war, den Sie im Hintergrund ausgeführt haben (mit '&').

Wenn es nicht die letzte war, geben Sie: ein jobsund suchen Sie die 'Auftragsnummer', dargestellt in '[]'. Dann tippe einfach:

fg 2

..wobei '2' die Auftragsnummer ist, zum Beispiel:

foo@bar:~/junk/books$ jobs
[1]+  Running                 okular how_to_cook_a_turkey.pdf &
foo@bar:~/junk/books$ fg 1
okular how_to_cook_a_turkey.pdf            <- this is now in the foreground.
schweizer Käse
quelle
4

Der richtige Weg ist, jobsdie Jobnummer einzugeben und dann zu töten. Um die PID zu verwenden, müssen Sie sie wie in der ersten Antwort beschrieben in den Vordergrund stellen.

Versuche dies

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

/Desktop$ kill %1  #(%1 is the job number)

Wenn Sie Jobs ausführen, nachdem Sie sie beendet haben, sollten Sie dies sehen

Desktop$ jobs
[1]+  Terminated              sleep 1000
tmac
quelle
4

Eine Sache, die ich hier nicht sehe und die ich besonders beim Testen von Befehlen als sehr nützlich empfunden habe, ist pidof. Mit können pidof [command]Sie die Prozess-ID eines Prozesses ermitteln, der gerade ausgeführt wird. Ich mag es, weil es mir erlaubt, die ID des gewünschten Befehls schnell zu finden, was normalerweise etwas ist, das ich gerade aufgerufen habe.

Sobald Sie die PID haben, können Sie den Prozess einfach abbrechen. Es ermöglicht das Erstellen einfacher Skripte zum Beenden eines Prozesses, wenn dieser gerade ausgeführt wird.

Try431
quelle
1
Ah das hat mir geholfen! kill% 1 funktionierte aus irgendeinem Grund nicht. "kill: Argument konnte nicht analysiert werden: '% 1'" und Strg + C funktionierten nicht. Ich konnte keinen Prozess in ps oder irgendetwas finden, weil es root war (ich habe vergessen, dass ich sudo damit verwendet habe)
mjohnsonengr
1

Ein bekanntes Beispiel ist das stressTool. Angenommen, Sie haben Folgendes ausgeführt:

$ stress -c 4 -m 4 

und schloss das Terminalfenster. Der Prozess würde weiterhin Ihre Ressourcen aus dem Hintergrund verbrauchen.

Was ich mache:

$ x=`pgrep stress` ; sudo kill -9 $x 

pgrepListet die PIDs des betroffenen Prozesses auf und speichert sie in einer Variablen, xdie dann kill -9zum Beenden des Prozesses verwendet wird .

Saptarshi Ghosh
quelle
0

im letzten gestoppten Bash-Prozess (Strg-Z) werden Sie töten durch:

kill %%
kill -9 %%

oder wenn Sie wählen möchten, verwenden Sie:

jobs

dann:

kill %N

mögen kill %2

Sławomir Lenart
quelle