Dies sollte für jede Shell mit Job-Kontrolle zutreffen, die (größtenteils) als selbstverständlich angesehen werden kann, es sei denn, es handelt sich um eine wirklich alte Shell. Es ist im POSIX-Standard enthalten und dash
unterstützt sogar die Auftragssteuerung (wenn es interaktiv oder mit ausgeführt wird -m
).
Interaktiv
- Ctrl+ zunterbricht das aktuell vordergründige Programm
bg
Hintergrund das zuletzt angehaltene Programm
(verwenden Sie es bg %2
mit der Auftragsnummer, die Sie überprüfen können jobs
)
fg
wird das zuletzt angehaltene Programm in den Vordergrund stellen
In zsh
können Sie eine Schlüsselbindung schreiben, die implizit fg
von der Eingabeaufforderung über ein anderes Ctrl+ ausgeführt wird z:
_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
Es gibt wahrscheinlich auch eine clevere Möglichkeit, bg
beim Suspendieren implizit zu rennen , aber es scheint unklug; Zumindest für mich ist der Großteil meiner Ctrl+ zNutzung darauf zurückzuführen, dass Ctrl+ ces nicht gelingt, auszubrechen. Ich möchte dem zB kill %1
eher folgen als bg
und ich möchte sicher nicht standardmäßig töten! (Diese Logik geht auch dahin, warum ich diese Tastenzuordnung nicht mehr verwende: Wenn ich Ctrl+ anklopfe z, um einen Prozess zu stoppen, möchte ich, dass er als letztes fortgesetzt wird!)
Nicht interaktiv
Wenn Sie sich in einer anderen Shell-Instanz befinden (oder einem anderen Benutzer, der manchmal auch sudo
Befehle enthält), können Sie wahrscheinlich keine Jobnummern verwenden.
Sie können immer noch auf einen anderen Prozess einwirken, sobald Sie dessen Prozess-ID (PID) kennen. Sie können die PID mit pgrep …
oder ps aux |grep …
(oder von derselben Shell jobs -l
oder $!
) abrufen und dann ausführen:
kill -STOP $PID # suspend
kill -CONT $PID # continue (resume)
Wenn Sie die Prozess-ID nicht kennen und keine Bedenken haben, andere Instanzen des Prozesses nach Namen auszusetzen, können Sie Signale an eine der folgenden Adressen übergeben:
killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args
Ein CONT
Signal für ein Programm, das mit Ctrl+ z(und nicht mit bg
'd) gestoppt wurde, nimmt seinen Fortschritt wieder auf (im Vordergrund), so als ob Sie es gewesen wären fg
.
Betreff: Standardfehler
Bei der Bearbeitung dieser Frage werden Sie nach Standardfehlern gefragt:
Der Prozess gibt an stderr aus. Wie soll ich den Befehl fg <jobid>
ausgeben, während der Prozess an das Terminal ausgegeben wird?
Sofern der betreffende Job keine Komponenten im Hintergrund hat (oder der gesamte Job im Hintergrund kill -CONT
ist, z. B. über ), sollte die Ausgabe nicht angezeigt werden, während der Job angehalten ist.
Wenn immer noch Daten ausgegeben werden (Standardausgabe oder Standardfehler), wird Ihr Terminal zwar optisch überladen, die gesamte Ausgabe wird jedoch ignoriert, da sie nicht Teil Ihrer Eingabe ist. Dies könnte es schwieriger machen zu wissen, dass Sie keine Tippfehler eingegeben haben, aber (blind) fg
Entersollte die Eingabe ausreichen (es sei denn, Sie haben mehrere Jobs und der betreffende ist nicht der neueste. In diesem Fall benötigen Sie tatsächlich den Jobdeskriptor ).
Wenn Sie den Jobdeskriptor suchen müssen, verwenden Sie ein anderes Terminal, um das STOP
Signal über die oben beschriebenen nicht interaktiven Methoden zu senden . Dies sollte Ihre Anzeige freigeben (vielleicht Enterein paar Mal drücken oder ausführen clear
oder Ctrl+ L), damit Sie dann ausführen können jobs
, um den Jobdeskriptor zu finden, und dann ausführen, fg %N
wo N
diese Nummer ist.