Re: [ssfr] Finalement, ?a concerne bien le shell...

[ Thread Index | Date Index | More debianworld.org/shellscript-fr Archives ]


On 10/07/08 ? ? 20:34, Philippe Jacquot wrote:
>
> Philippe Jacquot a écrit :
>> Hello
>>
>> Je reviens mon problème lié à Perl. En fait, j'avais fait un signal  
>> handler qui intercepte SIGINT et lance la routine correspondante, en  
>> l'occurance afficher la liste des noeuds non parcourus lors de la  
>> découverte d'un arbre.
>> Je le lançais comme ça:
>> $ ./fb_explore.pl | tee Resultat.log
>> Quand je [ctrl+c], aucun affichage ne se produisait.
>>
>> Je viens par hasard de lancer ma commande *sans le pipe*, et là, ça  
>> fonctionne.
>> Du coup, je me demande qui prend le [ctrl+c ] au final, est-ce qu'il  
>> est répercuté sur les membres du pipe, qui le reçoit en premier ? Si  
>> c'est le "tail", est-ce qu'il envoit un SIGINT ou un autre SIGxxx aux  
>> membres précédents, ... ?
>>
>> (c'est pour construire un arbre d'amis d'amis d'amis... sur facebook,  
>> si ça intéresse quelqu'un...)
>>
>>
>> Merci de m'éclairer de vos lumières.  =)
>> Philippe
>>
>> ---
> C'est à s'arracher les cheveux...
> En fait, le handler est bien exécuté, puisqu'il m'affiche ma ligne de  
> log. Mais c'est tout ce qu'il fait. Il n'exécute pas le reste des  
> commandes. Du coup, je ne sais pas si c'est un problème relevant de bash  
> ou de perl, étant donné que le programme fonctionne sans le pipe.
> Je vais essayer sur la liste perl. Désolé pour le dérangement.  :)

Probleme interessant, j'ai essaye de reproduire avec ce script.

#!/bin/sh

stop() {
        echo "arret stderr" 1>&2
        echo "arret stdout"
        exit
}                               

trap 'stop' 2
echo debut
sleep 5
echo fin




A l'execution avec Ctrl-C, sans pipe puis avec
wallach:~ sh test.sh
debut
arret stderr
arret stdout
arret stderr
wallach:~ sh test.sh | tee r.log ; echo "LOG " ; cat r.log
debut
arret stderr
LOG 
debut

Ma theorie est que le ctrl-C est envoye a tous les processus et que tee
a donc ferme le stdout du script.
Je comprends pas par contre pourquoi, si je met un 2e 'arret stderr'
apres le stdout, il ne s'affiche pas, question de timing je suppose...

En regardant un peu les man, j'ai vu l'option qui change tout...
wallach:~ sh test.sh 2>&1 | tee -i r.log ; echo "LOG " ; cat r.log
debut
arret stderr
arret stdout
LOG 
debut
arret stderr
arret stdout

En ignorant les signaux au niveau du tee, on a tous les messages.

J'espere avoir fait avancer le schmilblick.

-- 
Stéphane Billiart                      http://perso.orange.fr/billiart/


---


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/