Wie kann ich einen angehaltenen Job unter Linux fortsetzen?

343

Wie kann ich einen angehaltenen Job unter Linux fortsetzen? Ich habe Emacs benutzt und versehentlich Strg-Z gedrückt, wodurch ich zurück zur Konsole geschossen bin. Ich kann es sehen, wenn ich "jobs" eingebe

[*****]$ jobs
[1]+  Stopped                 emacs test_queue.cpp
Bobby
quelle
Dies ist eigentlich ein ziemlich normaler Arbeitsablauf für Vim. Wenn Sie Ihre Befehle in Ihrem Bash-Verlauf behalten möchten, drücken Sie die Eingabetaste Ctrl-zund fahren dann fort. Offensichtlich können Sie Befehle ausführen, ohne Vim über den :!Befehl ed zu verlassen
icc97

Antworten:

382

Der Befehl fgist das, was Sie verwenden möchten. Sie können ihm auch eine Auftragsnummer geben, wenn mehr als ein Auftrag gestoppt wurde.

Ilkka
quelle
59
als referenz ist fg "vordergrund". Sie können den Job auch im Hintergrund mit "bg" fortsetzen.
Sirex
261

Die allgemeinen Jobsteuerungsbefehle unter Linux lauten:

  • jobs - listet die aktuellen Jobs auf
  • fg - setzt den nächsten Job in der Warteschlange fort
  • fg% [Nummer] - Job fortsetzen [Nummer]
  • bg - Schieben Sie den nächsten Auftrag in der Warteschlange in den Hintergrund
  • bg% [Nummer] - Schieben Sie den Job [Nummer] in den Hintergrund
  • kill% [number] - Job mit der Nummer [number] beenden
  • kill - [signal]% [number] - Sende das signal [signal] an job number [number]
  • disown% [number] - Deaktiviert den Prozess (kein Terminal mehr ist Eigentümer), sodass der Befehl auch nach dem Schließen des Terminals aktiv bleibt.

Das sind so ziemlich alle. Notieren Sie die% vor der Auftragsnummer in den Befehlen - dies ist der Hinweis darauf, dass Sie von Aufträgen und nicht von Prozessen sprechen.

Majenko
quelle
30
Ich vermeide "kill% 1", weil es wirklich sehr, sehr schlecht ist, es als "kill 1" zu
tippen
5
@barrycarter Das ist sehr wahr. Normalerweise mache ich ein fgund ein Ctrl-C;)
Majenko
6
@barry: Aus diesem Grund ignoriert init in Upstart standardmäßig SIG {TERM, KILL}.
Hallo71
7
Und natürlich "nie als root laufen";)
barrycarter
47

Sie können auch eingeben %<process_name>; Sie drücken in Emacs Strg-Z, geben dann %emacsdie Konsole ein und bringen sie wieder in den Vordergrund.

NickD
quelle
Sehr gut zu wissen
ZAD-Man
33

Um die anderen Antworten zu ergänzen, können Sie mit bash das überspringen, fgwenn Sie eine Auftragsnummer angeben.

Diese sind zum Beispiel gleichwertig und nehmen den letzten Job wieder auf:

%
%%
fg
fg %

Diese setzen Job # 4 fort:

%4
fg 4
Grawity
quelle
2
Obwohl das irgendwie cool ist, finde ich es immer noch einfacher zu tippen fgals %.
rr
3
%ist super, danke! Als Touch-Typist finde ich das fgsehr irritierend (gleicher Finger). Aber so ist es auch cd.
Gauthier
Und Sie können es entweder mit bg %oder nur im Hintergrund starten % &.
Wildcard
In meinem Fall, als ich versucht habe, fg zu verwenden, wird der angehaltene Prozess angezeigt und verschwindet schnell, und es ist nur <fg%> gelungen, ihn wiederherzustellen.
Lefi Tarik
20

Wenn Sie es nicht über das aktuelle Terminal gestartet haben ps aux | grep <process name>, suchen Sie mit die Prozessnummer (pid) und setzen Sie es fort mit:

kill -SIGCONT <pid>

(Trotz des Namens killhandelt es sich lediglich um ein Tool zum Senden eines Signals an den Prozess, mit dem Prozesse miteinander kommunizieren können. Ein "Kill-Signal" ist nur eines von vielen Standardsignalen.)

Bonus-Tipp: Umbrechen Sie das erste Zeichen des Prozessnamens mit [], um zu verhindern, dass der grepBefehl selbst in den Ergebnissen angezeigt wird. zB um emacsProzess zu finden , verwenden Sieps aux | grep [e]macs

Mahemoff
quelle
2
Dies funktioniert auch, wenn Sie einen gestoppten Prozess
ablehnen
Können Sie auch Zugriff auf die Ein- / Ausgabe erhalten, wie es geschieht, wenn Sie sagen fg?
Ciprian Tomoiagă
Dies ist ein viel flexiblerer Ansatz als die Arbeit mit Auftragsnummern. Daumen hoch.
Thomp45793