Bash: reprendre automatiquement une commande terminée par une erreur
10 réponses
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.
$ while ! wget http://gnagna.gna ; do echo "Encore!" ; done
?
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
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.
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
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)
( 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)
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)
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. [...]
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.
[...]
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
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
cedric <rixed@happyleptic.NOSPAM.org> 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
$ 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
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.
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.
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.
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
Le Tue, 30 Nov 2004 12:49:00 +0100, Rakotomandimby (R12y) Mihamina <mihamina@mail.rktmb.org> 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
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
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
On Tue, 30 Nov 2004 09:56:13 +0000
Stephane Chazelas <cette.adresse@est.invalid> 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.