[HS] problème d'interaction entre bash et sleep...

Le
Frédéric BOITEUX
Bonjour,

J'ai besoin d'écrire un script bash qui lance une commande qui peut
être longue ou même bloquante, et l'interrompre si c'est le cas au bout
d'un certain délai. Je lance donc ma commande dans un sous-shell, un
« sleep » dans un autre, et le premier des deux qui se termine nett=
oie
l'autre. Cela marche bien lorsque je lance mon script depuis une ligne
de commande, mais en fait, je veux récupérer la sortie standard de ce
programme dans une variable bash, et là, problème : le programme
s'exécute bien, mais si la commande voulue se termine rapidement et
nettoie le « sleep », une fois mon programme terminé, il semble que
bash attende la durée programmée du sleep avant de continuer !!

Voici une version simplifiée du programme (avec une commande « ls » q=
ui
ne devrait pas trop prendre de temps, et un sleep de 10 secondes) :

#!/bin/bash

cmd='ls >/dev/null'
function test1() {

set -x

trap 'kill -TERM $fils2 >/dev/null 2>&1' USR1

( eval $cmd &&
sleep 0.1 &&
kill -USR1 $$ ) &
fils1=$!

( sleep 10 &&
kill $fils1 >/dev/null 2>&1 ) &
fils2=$!

# attend que tout se termine
wait $fils2
trap - USR1

return 0
}

test1
exit $?


* Si je lance le programme depuis l'invite du shell, tout va bien :
$ time ./testSleep
+ trap 'kill -TERM $fils2 >/dev/null 2>&1' USR1
+ fils1=13248
+ sleep 10
+ fils2=13249
+ wait 13249
+ eval ls '>/dev/null'
++ ls
+ sleep 0.1
+ kill -USR1 13247
++ kill -TERM 13249
+ trap - USR1
+ return 0
+ exit 0

real 0m0.116s
user 0m0.000s
sys 0m0.004s


* si je récupère la sortie standard du programme dans une variable
bash, ma commande prend 10 secondes :
$ time res=$(./testSleep)
+ trap 'kill -TERM $fils2 >/dev/null 2>&1' USR1
+ eval ls '>/dev/null'
++ ls
+ fils1=14416
+ sleep 10
+ fils2=14418
+ wait 14418
+ sleep 0.1
+ kill -USR1 14415
++ kill -TERM 14418
+ trap - USR1
+ return 0
+ exit 0

real 0m10.015s
user 0m0.000s
sys 0m0.008s

[les traces jusqu'à « + exit 0 » apparaissent immédiatement]


Auriez-vous une explication à ce phénomène ? Ou encore mieux une
solution ;-) ?

Fred.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Bruno Muller
Le #9731451
--=-dPrdZph7kbAjUnU9oSvk
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: quoted-printable

Hello,

Le mardi 11 décembre 2007 à 12:28 +0100, Frédéric BOITEUX a écrit :
Auriez-vous une explication à ce phénomène ? Ou encore mieux une
solution ;-) ?



Un contournement :)

aptitude install timeout

Bruno

--
BIEN FAIT !
M : Mais... Hé ! Au secours !
P : Quand je te disais que ma caisse à chat était pleine de sable
mouvant...

--=-dPrdZph7kbAjUnU9oSvk
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: Ceci est une partie de message
=?ISO-8859-1?Q?numériquement?= =?ISO-8859-1?Q?_signée?
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQBHXnl0uJD2bkb8m5sRAlbwAJoD9SqXb4DIA3yhrISlLrI1LVuqcQCgiKI1
l3uYOSXUV7/aFZfdyXF57oA =jFb5
-----END PGP SIGNATURE-----

--=-dPrdZph7kbAjUnU9oSvk--


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Petit Louis
Le #9731341
Bruno Muller a écrit :
Hello,

Le mardi 11 décembre 2007 à 12:28 +0100, Frédéric BOITEUX a écrit :

Auriez-vous une explication à ce phénomène ? Ou encore mieux une
solution ;-) ?




Un contournement :)

aptitude install timeout

Bruno




Je ne connaissais pas, je vais connaître ! Merci, je me renseigne.

P'tit Louis.


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Publicité
Poster une réponse
Anonyme