OVH Cloud OVH Cloud

Bash: reprendre automatiquement une commande terminée par une erreur

10 réponses
Avatar
Gauthier
Bonjour à tous,

J'aimerais connaître en Bash la manière d'insérer une commande dans une
structure de telle sorte qu'elle soit rappelée en cas d'interruption.
Par exemple, j'utilise un programme comme wget pour télécharger un gros
fichier, et la connexion réseau s'interrompt (wget renverra alors un
message d'erreur ; la plupart des programmes renvoyant d'ailleurs des
erreurs différenciées selon l'origine du problème, il doit y avoir moyen
d'affiner la réaction à adopter). Il faudrait alors relancer
wget sans mon intervention jusqu'à ce que la connexion soit rétablie.

Merci d'avance,
--
^^ Gauthier
(_____/°°-ç
| \_`-"
)/@mmm||
\nn \nn FOE-Belgium : http://www.amisdelaterre.be

10 réponses

Avatar
cedric
Quelquechose comme :

$ while ! wget http://gnagna.gna ; do echo "Encore!" ; done

?
Avatar
Stephane Chazelas
2004-11-30, 05:02(+00), Gauthier:
J'aimerais connaître en Bash la manière d'insérer une commande dans une
structure de telle sorte qu'elle soit rappelée en cas d'interruption.
Par exemple, j'utilise un programme comme wget pour télécharger un gros
fichier, et la connexion réseau s'interrompt (wget renverra alors un
message d'erreur ; la plupart des programmes renvoyant d'ailleurs des
erreurs différenciées selon l'origine du problème, il doit y avoir moyen
d'affiner la réaction à adopter). Il faudrait alors relancer
wget sans mon intervention jusqu'à ce que la connexion soit rétablie.
[...]


Apparemment, par defaut, wget reessaie 20 fois tu peux changer
ca avec l'option --tries. Par contre, si tu as un "connection
refused", il s'arrete.


Tu peux utiliser lftp a la place, il fait la meme chose que wget
sauf que s'il a un connection refused, il attend un peu et
reessaie plus tard.

--
Stephane

Avatar
Rakotomandimby (R12y) Mihamina
( Tue, 30 Nov 2004 05:02:11 +0000 ) Gauthier :

Bonjour à tous,


Bonjour,

j'utilise un programme comme wget pour télécharger un gros
fichier,


En plus des reponses des autes contributeurs, je dirai que pour le
transfert de fichier, il vaut mieux utiliser un protocole de transfert de
fichier : File Transfert Protocol.

Le serveur source ne permet-il pas le FTP?
Sinon il y a ncftp aussi (qui inclut ncftpget, et ncftpput ...)
--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)

Avatar
Stephane Chazelas
2004-11-30, 12:49(+01), Rakotomandimby (R12y) Mihamina:
[...]
En plus des reponses des autes contributeurs, je dirai que pour le
transfert de fichier, il vaut mieux utiliser un protocole de transfert de
fichier : File Transfert Protocol.
[...]


HTTP est un protocole de transfert de fichier.

--
Stephane

Avatar
Etienne de Tocqueville
cedric writes:

Quelquechose comme :

$ while ! wget http://gnagna.gna ; do echo "Encore!" ; done


Plutôt :

while ! wget http://gnagna.gna ; do sleep 60; echo "Encore!" ; done

Avatar
Stephane Chazelas
2004-11-30, 13:24(+01), Etienne de Tocqueville:
cedric writes:

Quelquechose comme :

$ while ! wget http://gnagna.gna ; do echo "Encore!" ; done


Plutôt :

while ! wget http://gnagna.gna ; do sleep 60; echo "Encore!" ; done


Ou, si on veut etre plus portable:

until wget http://gna.gna; do sleep 60; echo "Encore!"; done

! et until sont POSIX, mais "!" n'est pas Bourne

--
Stephane


Avatar
Pascal Bourguignon
Gauthier writes:
J'aimerais connaître en Bash la manière d'insérer une commande dans une
structure de telle sorte qu'elle soit rappelée en cas d'interruption.
Par exemple, j'utilise un programme comme wget pour télécharger un gros
fichier, et la connexion réseau s'interrompt (wget renverra alors un
message d'erreur ; la plupart des programmes renvoyant d'ailleurs des
erreurs différenciées selon l'origine du problème, il doit y avoir moyen
d'affiner la réaction à adopter). Il faudrait alors relancer
wget sans mon intervention jusqu'à ce que la connexion soit rétablie.


Il faut gérér les codes de status retournés par les programmes.

commande
echo $? # affiche le code de status, 0 = ok, pas 0 = erreur.

Les opérateurs bash while, if, &&, || (et d'autres) utilisent ces
status.

Les valeurs de ces status dépendent uniquement de la commande en
question. man la-commande, section DIAGNOSTICS. Quelques valeurs
sont "standardisées" sur linux, voir /usr/include/sysexists.h

Par exemple:

grep $token $file
status=$?
case $status in
0) echo $token found in $file ;;
1) echo no $token found in $file ;;
2) echo an error occured ;;
*) echo some other status code returned: $status ;;
esac



Ceci dit, quand j'entend interruption, je traduis sur unix par
signal, et alors la réponse serait, signal(2) dans un programme C et
trap dans bash:

cat >exemple <<EOF
#!/bin/bash
trap 'echo "interrompu par un signal USR1" ; exit 1' USR1
while true ; do sleep 1 ; echo -n . ; done
EOF
chmod 755 exemple
./exemple & child=$! ; sleep 5 ; kill -USR1 $child


--
__Pascal Bourguignon__ http://www.informatimago.com/
The world will now reboot; don't bother saving your artefacts.

Avatar
Gauthier
Le Tue, 30 Nov 2004 12:49:00 +0100, Rakotomandimby (R12y) Mihamina a écrit:
En plus des reponses des autes contributeurs, je dirai que pour le
transfert de fichier, il vaut mieux utiliser un protocole de transfert de
fichier : File Transfert Protocol.


Je citais surtout wget à titre d'exemple ; mais pour votre info, il
permet également les transferts ftp, et reprend le téléchargement
interrompu sans devoir tout rapatrier depuis le début.
Très bon programme (existe aussi pourr Win), permet les rapatriements
récursifs en ftp, entre autres.

--
^^ Gauthier
(_____/°°-ç
| _`-"
)/@mmm||
nn nn FOE-Belgium : http://www.amisdelaterre.be

Avatar
Jérémy JUST
On Tue, 30 Nov 2004 09:56:13 +0000
Stephane Chazelas wrote:

Apparemment, par defaut, wget reessaie 20 fois tu peux changer
ca avec l'option --tries. Par contre, si tu as un "connection
refused", il s'arrete.

Tu peux utiliser lftp a la place, il fait la meme chose que wget
sauf que s'il a un connection refused, il attend un peu et
reessaie plus tard.


Avec « --waitretry », on peut aussi paramétrer un délai (croissant)
entre deux essais successifs avec wget.

--
Jérémy JUST

Avatar
Gauthier
Merci pour ces propositions.

Cordialement,
--
^^ Gauthier
(_____/°°-ç
| _`-"
)/@mmm||
nn nn FOE-Belgium : http://www.amisdelaterre.be