Ich habe einen Prozess ursprünglich im Vordergrund ausgeführt. Ich habe durch Ctrl+ suspendiert Zund setze dann seine Ausführung im Hintergrund durch fort bg <jobid>
.
Ich frage mich, wie ich einen im Hintergrund laufenden Prozess anhalten kann.
Wie kann ich einen Hintergrundprozess in den Vordergrund bringen?
Bearbeiten:
Der Prozess gibt an stderr aus. Wie soll ich den Befehl fg <jobid>
ausgeben, während der Prozess an das Terminal ausgegeben wird?
fg <jobid>
, um ihn in den Vordergrund zu stellen?Antworten:
Geben Sie, wie Tim sagte, ein
fg
, um den letzten Vorgang wieder in den Vordergrund zu stellen.Wenn mehr als ein Prozess im Hintergrund ausgeführt wird, gehen Sie folgendermaßen vor:
fg %3
um denvim 23
Prozess wieder in den Vordergrund zu bringen .Um den im Hintergrund laufenden Prozess anzuhalten, verwenden Sie:
Das SIGSTOP-Signal stoppt (pausiert) einen Prozess im Wesentlichen auf die gleiche Weise wie Ctrl+ Z.
Beispiel:
kill -STOP %3
.Quellen: Senden von Signalen an Prozesse unter Linux und Unix und Verwalten von Hintergrund- und Vordergrundjobs .
quelle
SIGCONT
für mich; Ich benutzekill -STOP
undkill -CONT
bevorzugt , um die Zahlen sowieso erinnern, aber Sie können überprüfen ,kill -l
sie die numerischen Werte erinnern anjob
undfg <jobid>
während der Prozess an das Terminal ausgegeben wird?kill -STOP %job_id
wie erläutertDies 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
bg
Hintergrund das zuletzt angehaltene Programm(verwenden Sie es
bg %2
mit der Auftragsnummer, die Sie überprüfen könnenjobs
)fg
wird das zuletzt angehaltene Programm in den Vordergrund stellenIn
zsh
können Sie eine Schlüsselbindung schreiben, die implizitfg
von der Eingabeaufforderung über ein anderes Ctrl+ ausgeführt wird z: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 zBkill %1
eher folgen alsbg
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 …
oderps aux |grep …
(oder von derselben Shelljobs -l
oder$!
) abrufen und dann ausführen: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:
Ein
CONT
Signal für ein Programm, das mit Ctrl+ z(und nicht mitbg
'd) gestoppt wurde, nimmt seinen Fortschritt wieder auf (im Vordergrund), so als ob Sie es gewesen wärenfg
.Betreff: Standardfehler
Bei der Bearbeitung dieser Frage werden Sie nach Standardfehlern gefragt:
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ührenclear
oder Ctrl+ L), damit Sie dann ausführen könnenjobs
, um den Jobdeskriptor zu finden, und dann ausführen,fg %N
woN
diese Nummer ist.quelle
CONT
Signal an einen Prozess (Job / Pipeline) senden, der mit Strg + Z gestoppt wurde, wird es im Hintergrund fortgesetzt, auch wenn Sie es nichtbg
getan haben.Geben Sie ein
fg
, um es in den Vordergrund zu bringen.quelle
fg <jobid>
ausgeben, während der Prozess an das Terminal ausgegeben wird?jobs
befehl auffg
; z.B:fg %4
CTRL Z
auszusetzenbg %4
quelle
Das Beenden eines Prozesses kann auf verschiedene Arten erfolgen. Bei einem konsolenbasierten Befehl wird der Befehl häufig durch Senden eines CtrlcTastenanschlags (dem Standardinterruptzeichen) beendet. Dies funktioniert, wenn der Prozess im Vordergrundmodus ausgeführt wird.
Wenn ein Prozess im Hintergrundmodus ausgeführt wird, müssen Sie zuerst die Job-ID mit dem
ps
Befehl abrufen. Anschließend können Sie den Prozess mit dem Befehl kill wie folgt beenden:Hier würde der
kill
Befehl denfirst_one
Prozess beenden . Wenn ein Prozess einen regulärenkill
Befehl ignoriert , können Siekill -9
die Prozess-ID wie folgt verwenden:quelle