Es gibt gestoppte Jobs (bei Bash-Exit)

158

Ich erhalte die Meldung, There are stopped jobs.wenn ich manchmal versuche, eine Bash-Shell zu beenden. Hier ist ein reproduzierbares Szenario in Python 2.x:

  • ctrl+ cwird vom Interpreter als Ausnahme behandelt.
  • ctrl+ z'stoppt' den Prozess.
  • ctrl+ beendet dPython für Reals.

Hier sind einige reale Terminalausgaben:

example_user@example_server:~$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ctrl+z

[1]+  Stopped                 python
example_user@example_server:~$ exit
logout
There are stopped jobs.

Bash hat nicht beendet, ich muss noch exiteinmal die Bash-Shell beenden.

  • F: Was ist ein abgebrochener Job oder was bedeutet das?
  • F: Kann ein angehaltener Prozess fortgesetzt werden?
  • F:exit Tötet der erste die gestoppten Jobs?
  • F: Gibt es eine Möglichkeit, die Shell beim ersten Mal zu verlassen? (ohne exitzweimal einzutreten )
ThorSummoner
quelle
Strg + Umschalt + \ bewirkt auch das Beenden von Python.
ThorSummoner

Antworten:

206

Ein angehaltener Job ist ein Job, der vorübergehend in den Hintergrund gestellt wurde und nicht mehr ausgeführt wird, aber immer noch Ressourcen verbraucht (dh Systemspeicher). Da dieser Job nicht mit dem aktuellen Terminal verbunden ist, kann er keine Ausgabe produzieren und empfängt keine Eingaben vom Benutzer.

Sie können Jobs, die Sie ausgeführt haben, mit dem jobseingebauten Befehl in bash anzeigen, wahrscheinlich auch andere Shells. Beispiel:

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 

Sie können einen angehaltenen Job mit dem integrierten fg(Vordergrund-) Bash-Befehl fortsetzen. Wenn Sie mehrere gestoppte Befehle haben, müssen Sie angeben, welchen Sie fortsetzen möchten, indem Sie die Jobspezifikationsnummer in der Befehlszeile mit übergeben fg. Wenn nur ein Programm gestoppt wird, können Sie fgalleine verwenden:

user@mysystem:~$ fg 1
python

Zu diesem Zeitpunkt befinden Sie sich wieder im Python-Interpreter und können mit Control-D beenden.

Umgekehrt können Sie killden Befehl entweder mit der Jobspezifikation oder der PID ausführen. Zum Beispiel:

user@mysystem:~$ ps
  PID TTY          TIME CMD
16174 pts/3    00:00:00 bash
17781 pts/3    00:00:00 python
18276 pts/3    00:00:00 ps
user@mysystem:~$ kill 17781
[1]+  Killed                  python
user@mysystem:~$ 

Um die Jobspezifikation zu verwenden, stellen Sie der Zahl den Prozentschlüssel (%) voran:

user@mysystem:~$ kill %1
[1]+  Terminated              python

Wenn Sie einen Beendigungsbefehl mit angehaltenen Jobs absetzen, wird die von Ihnen angezeigte Warnung ausgegeben. Die Jobs werden aus Sicherheitsgründen weiter ausgeführt. Damit stellen Sie sicher, dass Sie wissen, dass Sie versuchen, Jobs zu beenden, die Sie möglicherweise vergessen haben, dass Sie angehalten haben. Wenn Sie das zweite Mal den Befehl exit verwenden, werden die Jobs beendet und die Shell wird beendet. Dies kann bei einigen Programmen zu Problemen führen, die nicht auf diese Weise beendet werden sollen.

In bash können Sie anscheinend den logoutBefehl verwenden, der gestoppte Prozesse beendet und beendet. Dies kann zu unerwünschten Ergebnissen führen.

Beachten Sie auch, dass einige Programme möglicherweise nicht beendet werden, wenn sie auf diese Weise beendet werden, und dass Ihr System möglicherweise viele verwaiste Prozesse ausführt, die Ressourcen verbrauchen, wenn Sie es sich zur Gewohnheit machen, dies zu tun.

Beachten Sie, dass Sie einen Hintergrundprozess erstellen können, der angehalten wird, wenn Benutzereingaben erforderlich sind:

user@mysystem:~$ python &
[1] 19028
user@mysystem:~$ jobs
[1]+  Stopped                 python

Sie können diese Jobs auf dieselbe Weise fortsetzen und beenden, wie Sie Jobs ausgeführt haben, die Sie mit dem Ctrl-zInterrupt gestoppt haben .

Oldtimer
quelle
4
Ich würde mit Ihrem zweiten Satz streiten. Die Meldung sollte lauten: „Da der Job angehalten wurde , kann keine Aktion ausgeführt werden - Datei-E / A, Netzwerk-E / A, Terminal-E / A oder sonstige Verarbeitung.“
Scott,
2
Das hilft mir sehr.
Shellbye
Hervorragender Beitrag, tolle Hilfe für jeden!
George Udosen
18

F: Was ist ein abgebrochener Job oder was bedeutet das?

Angehaltener Job ist ein Prozess, der ein Stoppsignal ( SIGSTOP/ SIGTSTP) von der Tastatur (Unterbrechungszeichen Ctrl-Z), einem Befehl (z. B. kill -STOP [PID]) oder einem anderen Prozess (z. B. Kernel, wenn das System nicht über ausreichende Ressourcen verfügt) empfangen hat und sich im angehaltenen Zustand befindet Ein Prozess, der keine Ausführung / Verarbeitung durchführt.

Aktive Shell - Aufträge können von aufgelistet werden: jobs.

F: Kann ein angehaltener Prozess fortgesetzt werden?

Der gestoppte Prozess setzt seine Ausführung nur dann fort, wenn ihm das SIGCONTSignal gesendet wird. Dies kann erreicht werden, indem der Job entweder durch fg(oder fg ID) in den Vordergrund verschoben wird, wodurch er zum aktuellen Job wird, bgim Hintergrund fortgesetzt wird, oder indem ein SIGCONTSignal gesendet wird (z kill -CONT [PID]. B. ).

F: Bricht der erste Exit die gestoppten Jobs ab?

Zum ersten Mal bei der Eingabe exit/ logoutoder drücken Sie Ctrl-Ddie Schale druckt eine Warnmeldung über die aktuellen aktive Aufträge , die mit dem Terminal verbunden sind, deshalb wird es nicht , dass Sie diejenigen ohne Ihre Erlaubnis töten durch die Aktion zweites Mal bestätigt. Wenn die checkjobsOption aktiviert ist ( shopt -s checkjobs), können die Jobs auch mit ihrem Status aufgelistet werden.

F: Gibt es eine Möglichkeit, die Shell beim ersten Mal zu verlassen? (ohne zweimal Ausfahrt eingeben)

Sie können Ctrl+Dzweimal drücken oder länger gedrückt halten. Dadurch wird die Shell leise beendet und die aktuellen angehaltenen / ausgeführten Shel-Jobs werden schnell abgebrochen.

Alternativ verleugne sie ( disown) , um sie sie zu verlassen oder töten manuell: kill $(jobs -p).

Kenorb
quelle