Forum Programmation.shell mkfifo et erreur 'Broken Pipe'

Posté par  (site web personnel) .
Étiquettes : aucune
0
21
jan.
2007
Bonsoir,

J'utilise la version svn de gajim (pour mon jabber). Donc j'ai un petit script shell 'gajom-svn' qui met à jour ma copie locale depuis le svn et si modification il y a eu, recompile les modules nécessaires.
De plus, pour que je puisse voir ce qui se passe, j'ai décidé de rediriger la sortie de toutes les commandes (svn, compilation, gajim) vers une pipe (que je crée au début) et de lancer un xterm en background qui va executer un tail -f sur cette pipe.

Mon problème : Lorsque je ferme le terminal avant que gajim soit lancé, gajim ne se lance pas. Et si je ferme le terminal lorsque gajim est lancé, gajim reçoit l'exception IO.Broken_Pipe

Ma question : comment faire en sorte que lorsqu mon xterm (avec mon tail -f dedans) se ferme le restecontinue a s'exécuter ?

Voici mon script :

#! /usr/bin/env bash

svn_revision(){
svn info | grep '^Revision: ' | cut -d' ' -f2
}

fifo="/tmp/gajim-svn-$$"
rm -f "$fifo"
mkfifo "$fifo"
#exec >"$fifo" 2>"$fifo"
#zenity --text-info --title="Gajim SVN" --filename="$fifo" &
xterm -title "Gajim SVN log" -e tail -n +0 -f "$fifo" &

echo ">>> Start Gajim" >"$fifo" 2>&1
echo ">>> Using FIFO $fifo" >"$fifo" 2>&1

cd ~/.local/opt/ >"$fifo" 2>&1
if [ -d gajim_svn ]; then
cd gajim_svn >"$fifo" 2>&1
oldrev="`svn_revision 2>"$fifo"`"
echo ">>> SVN at revision $oldrev. updating" >"$fifo" 2>&1
svn up >"$fifo" 2>&1
newrev="`svn_revision 2>"$fifo"`"
echo ">>> SVN updated at revision $newrev." >"$fifo" 2>&1
else
echo ">>> Checking out SVN tree from: svn://svn.gajim.org/gajim/trunk" >"$fifo" 2>&1
svn co svn://svn.gajim.org/gajim/trunk gajim_svn >"$fifo" 2>&1
cd gajim_svn >"$fifo" 2>&1
oldrev="`svn_revision 2>"$fifo"`"
newrev="$oldrev"
echo ">>> SVN revision: $newrev" >"$fifo" 2>&1
fi


if [ "a$oldrev" != "a$newrev" ]; then
echo ">>> SVN tree updated" >"$fifo" 2>&1
echo ">>> ./autogen.sh" >"$fifo" 2>&1
./autogen.sh >"$fifo" 2>&1
echo ">>> make" >"$fifo" 2>&1
make >"$fifo" 2>&1
fi

echo ">>> Run Gajim: ./launch.sh (argv0: gajim-svn)" >"$fifo" 2>&1
exec -a gajim-svn ./launch.sh >"$fifo" 2>&1



Merci pourtout éclaircissement.
Mildred
  • # Screen ?

    Posté par  . Évalué à 1.

    Hello,

    Un peu compliqué l'utilisation des FIFO :-)

    Un outils fort sympatique (je dirais même vital) est screen.
    Il s'apparente à un window manager, où les fenêtres sont des terminaux textes (sisi, une belle console ^__^).

    Après, pour la mise à jour & compilation & co, j'utiliserais bien cron et des journaux logs (fichiers) avec un petit envoi par mail pour me tenir au courant :-)

    Bon courage !

    Cdlt,

    PS: La FIFO a besoin d'au moins 1 lecteur + 1 écrivain tout le temps pour que les écritures ne soient pas bloquées en attente de lecture.
    Pour que le lecteur (tail -f &) ne s'arrête jamais, il faudrait que son père (niveau process) soit init (PID=1), un peu comme si c'était un daemon.
    Cela devient compliqué, non ?

    PS2: Quelques pistes sinon, nohup, setsid, start-stop-daemon / daemonize / ??? ;-)
    • [^] # Re: Screen ?

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

      Merci, du coup je crois que je fais utiliser un bête fichier log classique. :)

      Au fait, par le plus grand des hasards, je cherche quelque chose comme scren mais pour X11. Pas un window manager, il y en a déja a profusion, mais un plutôt un serveur X proxy qui reçoive les connexions et les redirige vers le serveur X principal, mais dans le cas ou le serveur X se plante, les applications du serveur proxy seraient toujours active et les fenêtres réapparaitraient si je relance le serveur principal ...
      J'aimerais bien.

Suivre le flux des commentaires

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