Forum général.cherche-logiciel Un script d'apel qui se bloque lors d'une erreur

Posté par  .
Étiquettes : aucune
0
20
mar.
2006
Tout d'abord bonjour.
Je débute totalement sous linux, je suis en bts et mon projet se deroule sous cet OS.
Je ne demande aucunement qu'on me fasse mon travail biensur ^^ mais juste qu'on m'aide.

Je dois réaliser un script en bash qui appelle plusieurs numéros.
Le numéro répond alors il y a l'envoie d'un fichier.
Des que le fichier est envoyé le script continue et numérote le prochain numéro de mon tableau.

Si le numéro répond alors tout se déroule sans problème et le script continue.
Mais si le numéro est faux, ou occupé, ou pas de décrochage alors le script se ferme et ne tente pas la numérotation de la suite de mon tableau.

En gros j'aimerais savoir comment faire pour que mon script ne s'arrète pas des lors qu'il y a une erreur.
Est ce qu'il existe quelque chose du même type que "Try > Catch" mais en bash?

Voici déja ce que j'ai fait:


#!/bin/bash

#--- Déclaration ---
tel=(542 10 0) #0 pour signaler la fin
dateuh=`date`
ligne=" "


#--- Fonction qui compte le nombre de telephone du tableau ---
nb=0 #Déclaration du nombre de tel à 0

while [ ${tel[$nb]} != 0 ] #Tant que ce qu'il y a dans le tableau est different de 0
do #Faire
nb=$((nb+1)) #nb = nb + 1
done


#--- Fonction qui passe les appels ---
for (( i=0; i < nb; i++ )) #Boucle jusqu'à la fin des numéros
do #Faire
echo Connexion vers... ${tel[$i]} #Affiche Connexion vers... numéro
/usr/sbin/pppd connect "/usr/sbin/chat -v '' ATZ OK ATDT,${tel[$i]} CONNECT ''" /dev/ttyS0 38400 &
pid_connexion=$!

sleep 35
ping -c 1 192.168.0.9


if [ $? == '0' ] #Si le resultat obtenue est 0
then
succes_connexion="[SUCCES]: La connexion vers ${tel[$i]} a reussi @ $dateuh"
echo $succes_connexion >> etat.log

ncftpput -u user -p pass -t 60 -V 192.168.0.9 /home/testS/ /home/testC/test.txt
sleep 20

if [ $? == '0' ]
then
succes_envoie="[SUCCES]: L'envoie vers ${tel[$i]} a reussi @ $dateuh"
echo $succes_envoie >> etat.log
echo $ligne >> etat.log
kill $pid_connexion &

else
echec_envoie="[SUCCES]: L'envoie vers ${tel[$i]} a échoué @ $dateuh"
echo $echec_envoie >> etat.log
echo $ligne >> etat.log
fi


else
erreur_connexion="[ERREUR]: La connexion vers ${tel[$i]} a échoué @ $dateuh"
erreur_envoie2="[ERREUR]: L'envoie vers ${tel[$i]} a DONC échoué @ $dateuh"
echo $erreur_connexion >> etat.log
echo $erreur_envoie2 >> etat.log
echo $ligne >> etat.log
fi

done
  • # ping sans timeout

    Posté par  . Évalué à 2.

    Ton problème est-il vraiment que ton script se "ferme" (donc qu'il te rend la main), ou plutot qu'il s'arrete dans le sens où il reste bloqué infiniment ?

    En effet chez moi, un "ping -c 1 machine" d'une machine morte attend infiniment la réponse. Ajoute un délai maximal (par exemple "-w 10" pour attendre 10 secondes) pour etre sûr d'avoir un code de retour dans tous les cas.

    Attention, a un moment aussi tu testes le code de retour de ncftp alors qu'il y a une commande sleep entre-temps: tu testes alors le code de sleep, pas du ftp. Stocke-le dans une variable temporaire avant d'appeler le sleep.
    • [^] # Re: ping sans timeout

      Posté par  . Évalué à 1.

      Merci pour cette reponse.

      Au sujet du ncftp j'ai remarquer cette apres midi aussi qu'il y avait un probleme dû au sleep. :p
      J'ai résolu ce probleme, j'ai d'ailleurs fait exactement comme tu l'as dit. lol

      Pour ta solution avec le -w 10 je testerais demain et je te tiendrais au courant.
      Par contre j'ai un autre probleme maintenant, apres l'envoie du fichier et la recomposition d'un autre numéro il me dit que le pid bloque le port serie (ttys0) et donc le script plante. ^^

      Comment je peux tuer ce processus?

      Je te tiendrais au courant demain.
      Merci dagget
      • [^] # Re: ping sans timeout

        Posté par  . Évalué à 2.

        Tu tue l'ancien pppd avec un kill lancé en détaché ( "&" ).
        Donc le signal de terminaison est envoyé, et pppd fait son travail de fin propre (il ferme la connexion, etc). Mais ton script se poursuit en parallele. Donc le nouveau pppd se lance alors que l'ancien n'est pas encore fini.

        Lance ta commande kill normalement, et attend un peu, au besoin teste que l'ancien pid a enfin disparu, avant de poursuivre ta boucle.

Suivre le flux des commentaires

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