Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

thurston a écrit :

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