#1 Le 27/01/2008, à 22:39
- thurston
[RESOLU] detecter la présence d'un serveur dans un script
Bonjour,
Je souhaite utiliser une condition de présence d'un serveur de fichiers avant de lancer une commande de lecture d'une playlist mp3. Le client réveille en théorie le serveur de fichiers (contenant la musique) en wake on lan. Dès que le serveur apparait sur le réseau, la commande peut s'effectuer.
Quelqu'un a une idée de la fonction à utiliser? Un simple ping?
Je pourrais utiliser la commande suivante,
netstat -lataupe |grep ESTABLISHED |grep 192.168.0.x|wc -l
(x pour l'IP du serveur) mais ayant autofs d'installé sur le client, si je ne fais pas l'action de monter (par l'acces simple à un fichier ou repertoire sur le serveur par exmple) un repertoire distant, le résultat me donnera toujours 0, même si le serveur est présent. Or je n'ai ni clavier ni souris sur le client.
Quelqu'un à une idée? En utilisant la commande ping, peut on en étudier le résultat dans une boucle if?
Merci d'avance
Thurston
Dernière modification par thurston (Le 28/01/2008, à 19:02)
Hors ligne
#2 Le 28/01/2008, à 00:58
- HymnToLife
Re : [RESOLU] detecter la présence d'un serveur dans un script
Quelqu'un à une idée? En utilisant la commande ping, peut on en étudier le résultat dans une boucle if?
Bien sûr :
firas@nobue ~ % if ping -c 1 www.domain.tld &> /dev/null; then echo "foo"; fi
firas@nobue ~ % if ping -c 1 google.fr &> /dev/null; then echo "foo"; fi
foo
- Rodrigue, as-tu du cœur ?
- Non, mais j'ai du pique !
Hors ligne
#3 Le 28/01/2008, à 01:01
- bertrand0
Re : [RESOLU] detecter la présence d'un serveur dans un script
Mettons que le serveur est un serveur SSH (ie port 22); la commande suivante permet de tester si le serveur est en ligne:
nmap -n -sP -PS22 -oG - ww.xx.yy.zz | grep "^Host: .*Status: Up$"
EDIT: effectivement, si le serveur n'est pas derrière un firewall, la solution ping est la plus indiquée. (remplacer -PS22 par -PE pour faire l'équivalent d'un ping)
Dernière modification par bertrand0 (Le 28/01/2008, à 01:12)
Ceux qui écrivent comme ils parlent, quoiqu'ils parlent très bien, écrivent mal.
Buffon, Discours sur le style
Hors ligne
#4 Le 28/01/2008, à 19:02
- thurston
Re : [RESOLU] detecter la présence d'un serveur dans un script
Un grand merci à tous les 2 pour ces réponses complètes.
Testé: ca marche nickel.
A+
Thurston
Hors ligne
#5 Le 28/01/2008, à 21:30
- thurston
Re : [RESOLU] detecter la présence d'un serveur dans un script
Euh, en fait je suis allé un peu vite. Je galère un peu sur l'écriture du script.
EN effet, l'option ping me jette si pas de serveur, ce qui est peut pratique pour faire une boucle avec plusieurs passage. Et quant à nmap, comment je récupère une valeur binaire du résultat du scan?
Ce que je voudrais:
"début"
=> j'attends 15s (sleep 15)
=> ping serveur
=> si serveur présent
=> je lance la lecture de ma liste de lecture (/usr/bin/mplayer -shuffle -playlist /home/music)
=> sinon je retourne au début
(si plus que 10 tentatives, alors je lis un fichier audio qui dit: "serveur en panne", ou alors un bip systeme.
Jamais programmé en bash, désolé, je pense que c'est de niveau débutant, mais j'en suis là .
A+
D'avance merci
Thurston
Dernière modification par thurston (Le 28/01/2008, à 21:32)
Hors ligne
#6 Le 28/01/2008, à 22:15
- thurston
Re : [RESOLU] detecter la présence d'un serveur dans un script
Après avoir transpiré à grosses gouttes.
#!/bin/bash
# note that mplayer program is installed in /usr/bin
# /usr/local/scripts/mp3autoplay
# sudo chmod +x /usr/local/scripts/mp3autoplay
# Sequence is stopped after nbmax times x time seconds
# crontab -e
# @reboot /usr/local/scripts/mp3autoplay
i=0
nbmax=5
time=10
while [ -n "$(ping -c 1 192.168.0.x|grep 100%)" ]
do
while [ $i -lt $nbmax ]
do
sleep $time
# echo "Connexion in progress..."
i=$(($i+1))
# echo $i
done
echo "Script stopped after" $i "tentatives. Check server administrator"
exit
done
/usr/bin/mplayer -shuffle -playlist /home/music
#music is the playlist to be played
Je pense que c'est un peu lourd comme script... les echo ne sont la que pour validation des étapes du script.
Dernière modification par thurston (Le 28/01/2008, à 22:22)
Hors ligne
#7 Le 29/01/2008, à 10:35
- Gari
Re : [RESOLU] detecter la présence d'un serveur dans un script
Quelques remarques:
1. Tu ne fais le test de ping qu'une seule fois. Entre deux "sleep", je ne vois pas de nouveau test de ping. Imaginons que ton serveur ne soit pas du tout connecté. Voici ce qui se passe:
i=0
ping
sleep 10
i=1
sleep 10
i=2
sleep 10
i=3
sleep 10
i=4
sleep 10
i=5
exit
On le voit, il n'y a qu'un seul ping d'effectué. Le comptage de i ne sert donc à rien.
Il faut donc enlever la seconde boucle while, qui ne sert à rien.
while ! ping -c 1 192.168.0.x;
do
i=$(($i+1))
if [[ $i -gt 4 ]] then
echo "Script stopped after" $i "tentatives. Check server administrator"
exit
fi
sleep $time
done
Dernière modification par Gari (Le 29/01/2008, à 10:37)
Hors ligne
#8 Le 29/01/2008, à 16:23
- thurston
Re : [RESOLU] detecter la présence d'un serveur dans un script
Salu Gari,
ben euh...merci beaucoup, quelques progrès devant moi...
Pour info, il y a un autre problème, je crois. Je ne pense pas que la sortie sur terminal soit active. Ne faudrait il pas jouer du xterm quelquepart? En effet, le script est silencieux, même si le server est inactif.
A+
Thurston
le code donc (le bon cette fois ci)
#!/bin/bash
# note that mplayer program is installed in /usr/bin
# /usr/local/scripts/mp3autoplay
# sudo chmod +x /usr/local/scripts/mp3autoplay
# Sequence is stopped after nbmax times x time seconds
# crontab -e
# @reboot /usr/local/scripts/mp3autoplay
i=0
nbmax=5
time=10
while ! ping -c 1 192.168.0.x;
do
i=$(($i+1))
if [[ $i -gt $nbmax ]] ; then
echo "Script stopped after" $i "tentatives. Check server administrator"
exit
fi
sleep $time
done
/usr/bin/mplayer -shuffle -playlist /home/music/playlist # avec mplayer
#playlist is the playlist to be played on a file server
Explication:
La commande ping (c 1: une fois) réussie renvoie un 0, que l'on peut voir avec
echo $?
. le ! devant inverse le résultat. Ainsi:
tant que le serveur est non présent, c'est à dire ping renvoie 1, et donc son inverse est 0, on déroule la boucle do /done, qui compte le nombre de coups. Le comptage se fait par [[ expr_cond ]] qui renvoie 0 ou 1 (vrai / faux).
sinon, on saute cette dernière et l'on execute la commande de lecture audio. Au final, j'utilise quodlibet, et la commande suivante
quodlibet --start-playing
qui lance quodlibet ou il en était resté, ce qui est pas mal aussi.
Pour ce qui est de l'affichage du message en cas de problème, le lancement par cron ne facilite pas la tache. j'ai bien essayé:
xterm -e bash -c "read -p'script stopped '"
mais cela ne suffit pas.
Dernière modification par thurston (Le 10/02/2008, à 21:53)
Hors ligne
#9 Le 03/02/2008, à 21:41
- thurston
Re : [RESOLU] detecter la présence d'un serveur dans un script
Bonjour,
J'ai découvert un gdesklet fabuleux sur ce sujet. "ping."
Celui ci:
1. teste (par ping) une adresse IP.
2. Montre une icone qui change de couleur (rouge si non présent), bleue si présent.
3. permet également d'affecter un script en cliquant sur l'icone.
J'y ai mis un wakeonlan sur l'adresse MAC du serveur.
Cela me permet donc de vérifier l'état du serveur, et de l'allumer par wol si éteint.
Tip top quoi
A+
Thurston
Hors ligne
#10 Le 10/02/2008, à 21:54
- thurston
Re : [RESOLU] detecter la présence d'un serveur dans un script
Bonjour,
Certains auront corrigé s'ils ont tenté d'utiliser le script, il manquait un " ; " juste avant le then.
Amitiés
Thurston
Hors ligne