Quel est un exemple pratique d'utilisation de la commande suspend dans Bash?

12

suspendest une commande intégrée dans Bash. Quand utiliseriez-vous naturellement cette commande et la trouveriez-vous utile?

igor
la source
1
Le shell se suspend à chaque fois qu'il opère un processus enfant, c'est-à-dire qu'il exécute une commande où ladite commande est un programme externe, nécessitant un fork/execappel système
the_velour_fog
1
Dans un shell interactif, cela permet au processus enfant d'obtenir le contrôle du terminal, sans que le shell parent n'interagisse avec le terminal, ce qui devient compliqué.
the_velour_fog
2
@velour, mais cela ne nécessite pas d'exécuter une commande distincte à cet effet?
ilkkachu
@the_velour_fog Techniquement, le shell parent n'est pas suspendu (il n'obtient pas de STOPsignal) lorsqu'il bifurque un processus enfant. Je suis également un peu confus par votre deuxième commentaire.
Kusalananda
1
@Kusalananda ok, le droit wait()me semble raisonnable. J'ai dit que le shell se suspend à chaque fois qu'il lance un processus enfant . Je n'ai rien dit sur la réception de signaux d'arrêt, cela n'aurait aucun sens.
the_velour_fog

Réponses:

14

Supposons que vous manquiez à la fois de GNU screenet tmux(et de X11 et de consoles virtuelles) mais que vous souhaitiez basculer entre un shell de connexion et un autre shell interactif.

Vous devez d'abord vous connecter sur la console, puis démarrer un nouveau shell, bloquant temporairement le shell de connexion. Pour récupérer le shell de connexion pour y travailler, vous le feriez suspend. Ensuite, vous devriez fgrécupérer le shell interactif pour continuer avec ce que vous avez fait là-bas.

En fait, avec le contrôle des travaux, le shell de connexion peut générer un certain nombre de shells interactifs en tant que jobs d'arrière-plan avec lesquels vous pouvez basculer fg %1, fg %2etc., mais pour revenir au shell de connexion, vous devez utiliser à suspendmoins que vous ne le souhaitiez manuellement kill -s STOP $$.

Notez également que Ctrl+ Zà l'invite dans un shell interactif ne le suspendra pas.

EDIT: J'avais initialement une longue section hypothétique sur l'utilisation de suspenddans un script, mais comme la commande nécessite un contrôle des travaux et que les shells non interactifs n'ont généralement pas de contrôle des travaux, j'ai supprimé cette section.


Section supprimée avec suspendremplacée par kill -s STOP $$(cela n'appartient plus vraiment à la réponse, mais cela peut être intéressant pour d'autres de toute façon):

Disons que vous avez un processus d'arrière-plan (un script) dans un script, et que ce processus d'arrière-plan à un certain stade doit s'arrêter et attendre que le processus parent lui dise de continuer. Cela pourrait être pour que le parent ait le temps d'extraire et de déplacer des fichiers en place ou quelque chose comme ça.

Le script enfant suspendait ( kill -s STOP $$) et le script parent lui envoyait un CONTsignal quand il était correct de continuer.

Il vous donne la possibilité d'implémenter une sorte de synchronisation entre un processus parent et un processus enfant (bien que très basique car le processus shell parent doit plus ou moins deviner que le processus enfant est suspendu, bien que cela puisse être résolu en ayant l'enfant intercepter CONTet ne pas suspendre si ce signal est reçu trop tôt).

Kusalananda
la source