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 dashunterstützt sogar die Auftragssteuerung (wenn es interaktiv oder mit ausgeführt wird -m).
Interaktiv
- Ctrl+ zunterbricht das aktuell vordergründige Programm
bgHintergrund das zuletzt angehaltene Programm
(verwenden Sie es bg %2mit der Auftragsnummer, die Sie überprüfen können jobs)
fg wird das zuletzt angehaltene Programm in den Vordergrund stellen
In zshkönnen Sie eine Schlüsselbindung schreiben, die implizit fgvon 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, bgbeim 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 %1eher folgen als bgund 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 sudoBefehle 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 -loder $!) 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 CONTSignal 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 -CONTist, 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) fgEntersollte 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 STOPSignal über die oben beschriebenen nicht interaktiven Methoden zu senden . Dies sollte Ihre Anzeige freigeben (vielleicht Enterein paar Mal drücken oder ausführen clearoder Ctrl+ L), damit Sie dann ausführen können jobs, um den Jobdeskriptor zu finden, und dann ausführen, fg %Nwo Ndiese Nummer ist.