Forum Programmation.shell SIGINT dans une boucle infinie

Posté par  .
Étiquettes : aucune
0
30
mar.
2006
Au cas ou l'on veut arreter une boucle infini du type


#file script.sh
while true
do
nslookup www.toto.com #ou autre
done


le SIGINT envoyer en tapant controle C est envoyer a la commande en cours d'execution (ici nslookup) et ne permets pas de sortir de la boucle.
Pour pouvoir sortir, il faut trapper le SIGINT dans le script soit :


#file script.sh
trap exit INT
while true
do
nslookup www.toto.com #ou autre
done


ou bien


#file script.sh
while true
do
trap break INT
nslookup www.toto.com #ou autre
done


....
Mon probleme vient de mes tests au sein d'un bash interactif :

aussi bien
[toto@toto.com]# trap exit INT; while true ; do nslookup www.toto.com; done
que
[toto@toto.com]# while true ; do trap break INT; nslookup www.toto.com; done

N'arrete pas le script : seul nslookup chope le SIGINT ...

Comment ce fesse ?
  • # PID

    Posté par  (site Web personnel) . Évalué à 2.

    Il est surement plus facile de récupérer le PID du script, avec $_ ou $$ ou $? je sais plus, et de lui envoyer un kill bien placé je pense.
    • [^] # Re: PID

      Posté par  . Évalué à 1.

      Et bien je n'ai pas envie de devoir killer mon bash en ineractif
      Et si je reste sur le script je trouve plus simple le TRAP qui ne demande a l'utilisateur que de faire juste un CTRL-C...
      De toute maniere j'aimerais bien comprendre pourquoi ca ne fonctionne pas en ligne de commande ... ?

      PPS : bon le trap exit INT n'est pas interessant en interactif, mais j'aimerais pouvoir utiliser le trap break INT dans le while ...
  • # Peut être comme ça

    Posté par  . Évalué à 4.

    Je viens de trouver une solution, qui n'est peut-être pas très élégante mais qui marche (chez moi...). Je me suis intéressé au problème car j'avais déjà voulu faire ça, et la solution "à larrache" que j'avais trouvé, c'était de bourriner sur Ctrl+c...
    Donc voici ce que j'ai trouvé :


    while true
    do
    nslookup www.toto.com &
    wait $!
    done


    En bref, ça lance le processus en arrière plan, mais ça l'attend tout de suite. L'astuce c'est que wait est une commande intégrée au shell, donc quand elle reçoit un SIGINT, c'est bien le shell qui s'interrompt.
    Seul petit "bug", c'est que la commande est généralement exécutée une dernière fois après l'avoir killée (comme on kill le wait, on revient au shell avant que notre commande ait pu (éventuellement) se terminer).

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.