Étant donné cette boucle:
while sleep 10s ; do
something-that-runs-forever
done
Lorsque j'appuie sur Ctrl + C, toute la boucle while est interrompue. Ce que je veux faire, c'est interrompre le processus "quelque chose", laisser passer 10 secondes, puis redémarrer "quelque chose".
Comment puis-je faire en sorte que ctrl + c n'affecte que "quelque chose", et non la boucle while?
EDIT: "interrompre" comme dans SIGINT. Tuer. Avorter. Mettre fin. Pas "interrompre" comme dans "pause".
fg
? Pourquoi utiliser Ctrl + C?What I want to do is to interrupt the "something"-process, let 10 seconds pass, and then restart "something"
. Si vous appuyez sur Ctrl + Z, attendez 10 secondes, puis exécutezfg
, c'est exactement ce qui se passera. Peut-être pourriez-vous modifier votre question et donner un exemple spécifique afin que nous puissions mieux comprendre?Réponses:
Cela devrait fonctionner si vous venez
trap
SIGINT
de quelque chose. Comme:
(true
).Interrompre le
something...
ne fait pas quitter le shell maintenant, car il ignore le signal. Cependant, si vous ^ C lesleep
processus, il se terminera avec un échec, et la boucle s'arrête à cause de cela. Déplacez lesleep
à l'intérieur de la boucle ou ajoutez quelque chose comme|| true
pour éviter cela.Notez que si vous utilisez
trap "" INT
pour ignorer complètement le signal (au lieu de lui affecter une commande), il est également ignoré dans le processus enfant, vous ne pouvez donc pas interrompre nonsomething...
plus. Ceci est explicitement mentionné dans au moins le manuel de Bash :la source
do (trap - INT; something-that-runs-forever)
être autoriser l'interruption de la commande. En outre, vous n'avez pas besoin de courir:
- vous pouvez simplement utiliser une chaîne vide pour ignorer un signal:trap '' INT
. Tout cela est POSIX, et devrait fonctionner sur n'importe quel shell compatible (pas seulement Bash).SIGINT
complète n'est pas strictement portable: "Les implémentations peuvent autoriser les noms avec leSIG
préfixe ou ignorer la casse dans les noms de signaux comme une extension . " (C'est moi qui souligne)trap "" INT
(également posix)trap :
placetrap ""
était exactement cela, pour ne pas ignorer le signal (mais en faire un no-op à la place), afin que nous n'ayons pas besoin de faire autre chose pour pouvoir interrompre lesomething
programme principal .Une autre option consiste à faire
something-that-runs-forever
gérer le signal (en quittant avec élégance quand il est reçu). Bien sûr, cela n'a de sens que lorsque ce programme est utilisé dans de nombreux scripts, et que le comportement souhaité sur CTRL+ Cest systématiquement le même - pour continuer l'exécution du script.la source