Was ist ein praktisches Beispiel für die Verwendung des Befehls suspend in Bash?

12

suspendist ein eingebauter Befehl in Bash. Wann würden Sie diesen Befehl natürlich verwenden und ihn nützlich finden?

igor
quelle
1
Die Shell hält sich jedes Mal an, wenn sie einen untergeordneten Prozess aufruft, dh einen Befehl ausführt, bei dem es sich um ein externes Programm handelt, für das ein fork/execSystemaufruf erforderlich ist
the_velour_fog
1
In einer interaktiven Shell kann der untergeordnete Prozess die Steuerung des Terminals übernehmen, ohne dass die übergeordnete Shell mit dem Terminal interagiert, was zu Problemen führt.
the_velour_fog
2
@velour, aber dafür muss kein separater Befehl ausgeführt werden?
Ilkkachu
@the_velour_fog Technisch gesehen wird die übergeordnete Shell nicht angehalten (es wird kein STOPSignal empfangen), wenn sie einen untergeordneten Prozess auslöst . Ich bin auch ein bisschen verwirrt über deinen zweiten Kommentar.
Kusalananda
1
@Kusalananda ok, richtig wait()klingt für mich vernünftig. Ich sagte, die Shell hebt sich jedes Mal auf, wenn sie einen untergeordneten Prozess auslöst . Ich habe nichts über den Empfang von Stoppsignalen gesagt, das würde keinen Sinn ergeben.
the_velour_fog

Antworten:

14

Angenommen, Ihnen fehlen sowohl GNU screenals auch tmux(und X11 sowie virtuelle Konsolen), Sie möchten jedoch zwischen einer Anmeldeshell und einer anderen interaktiven Shell wechseln.

Sie würden sich zuerst an der Konsole anmelden und dann eine neue Shell starten, um die Anmeldeshell vorübergehend zu blockieren. Damit die Login-Shell wieder funktioniert, müssen Sie Folgendes tun suspend. Dann würden fgSie die interaktive Shell zurückbekommen, um mit dem fortzufahren, was Sie dort getan haben.

Tatsächlich könnte die Anmeldeshell bei der Jobsteuerung eine Reihe interaktiver Shells als Hintergrundjobs erzeugen, zu denen Sie wechseln könnten fg %1, fg %2usw. Um jedoch zur Anmeldeshell zurückzukehren, müssten Sie diese verwenden, es suspendsei denn , Sie möchten dies manuell tun kill -s STOP $$.

Beachten Sie außerdem, dass Ctrl+ Zan der Eingabeaufforderung in einer interaktiven Shell diese Funktion nicht deaktiviert.

BEARBEITEN: Ich hatte anfangs einen langen hypothetischen Abschnitt über die Verwendung suspendin einem Skript, aber da der Befehl Jobsteuerung erfordert und nicht interaktive Shells normalerweise keine Jobsteuerung haben, habe ich diesen Abschnitt gelöscht.


Gelöschter Abschnitt mit suspendersetzt durch kill -s STOP $$(dies gehört nicht mehr zur Antwort, kann aber für andere trotzdem interessant sein):

Angenommen, Sie haben einen Hintergrundprozess (ein Skript) in einem Skript, und dieser Hintergrundprozess muss zu einem bestimmten Zeitpunkt angehalten werden und warten, bis der übergeordnete Prozess ihn auffordert, fortzufahren. Dies kann der Grund dafür sein, dass die Eltern Zeit haben, Dateien zu extrahieren und an ihren Platz zu verschieben.

Das untergeordnete Skript würde suspend ( kill -s STOP $$) und das übergeordnete Skript würde ein CONTSignal senden , wenn es in Ordnung wäre, fortzufahren.

Es gibt Ihnen die Möglichkeit, eine Art Synchronisation zwischen einem übergeordneten und einem untergeordneten Prozess zu implementieren (obwohl dies sehr einfach ist, da der übergeordnete Shell-Prozess mehr oder weniger davon ausgehen muss, dass der untergeordnete Prozess angehalten ist, obwohl dies durch das Vorhandensein des untergeordneten Prozesses behoben werden kann fangen CONTund nicht aussetzen, wenn das Signal zu früh empfangen wird).

Kusalananda
quelle