2017-07-12 7 views
1

J'essaye d'écrire un script shell pour envoyer un ping à chaque serveur listé dans un fichier spécifié et obtenir sa disponibilité. Le comportement prévu est que si un serveur n'est pas atteint après $ {TIMEOUT} secondes, le script arrête d'essayer de faire un ping sur ce serveur et passe au suivant dans la liste. Cependant, lorsqu'un ping pour un serveur arrive à expiration, le programme s'arrête complètement au lieu de simplement passer au serveur suivant dans la liste. Comment puis-je réparer cela?script shell - la boucle s'arrête lorsque le ping échoue

Voici l'extrait de code correspondant ($ {ALS_HOSTS} est la liste des serveurs à pingué):

while read hostid 
do 
     ping -c ${NUM_PING_PACKETS} ${hostid} 
     if ping -w ${TIMEOUT} -c ${NUM_PING_PACKETS} ${hostid} | grep ' from' 2>/dev/null 1>&2 # check for output 
     then 
       ssh ${hostid} uptime > ${WORKDIR}/${hostid} & 
     fi 
done < ${ALS_HOSTS} 

(ce script sera exécuté sur une machine CentOS 5 qui ne peut pas être mis à niveau ou reconfiguré Cette fois-ci)

Répondre

1

Cela peut être parce que ssh partage stdin avec la boucle while read, et draine toutes les données pour l'envoyer à l'hôte distant.

Utilisez ssh -n pour empêcher cela:

ssh -n ${hostid} uptime > ${WORKDIR}/${hostid} &