Aide ScriptShell :(
Bonjour,
Je cherche a faire un script-shell qui ping une ip et puisse lancé une application si l'ip ne ping plus , ou arrete cette application si l'ip ping de nouveau .
Ex: l'ip 192.X.X.X ping alors le script ne lance rien.
l'ip 192.X.X.X ne ping plus alors le script lance une application.
l'ip 192.X.X.X ping de nouveau alors le script stoppe l'application lancé precedement.
Voila si quelqu'un serait m'aider je l'en remercie d'avance .
Cordiallement.
GreG
Je cherche a faire un script-shell qui ping une ip et puisse lancé une application si l'ip ne ping plus , ou arrete cette application si l'ip ping de nouveau .
Ex: l'ip 192.X.X.X ping alors le script ne lance rien.
l'ip 192.X.X.X ne ping plus alors le script lance une application.
l'ip 192.X.X.X ping de nouveau alors le script stoppe l'application lancé precedement.
Voila si quelqu'un serait m'aider je l'en remercie d'avance .
Cordiallement.
GreG
25 réponses
Résumé de la discussion
Le fil porte sur la création d'un script shell qui ping une IP et lance ou arrête une application selon que la cible répond ou non. Plusieurs réponses proposent d'utiliser une boucle continue avec ping -c 1 -q et rediriger la sortie vers /dev/null, puis de démarrer ou tuer l'application en fonction du code retour. D'autres évoquent la gestion d'un PID stocké et vérifié avant d'arrêter ou relancer le processus, afin d'éviter les démarrages multiples et de réagir immédiatement au retour de connectivité. En pratique, plusieurs usages recommandent d'ajouter un délai entre les vérifications pour éviter un démarrage/arrêt trop fréquent et de tester le comportement sous différentes destinations réseau.
-
Si quelqu'un pouvais me reecrire le script en plus kler, parce ke la j'avoue que je suis un peu perdu du coup :( .
Cordiallement.
GreG -
Oui, c'est ce que je soupconne aussi: il manque un timeout. Mais il faut voir quelle version de ping Greg a. Sur certaines, le timeout existe mais n'est pas configurable, sur d'autres par contre, il existe l'option -W qui permet de la spécifier.
Par contre, je suis tout-à-fait contre l'utilisation d'un kill -9 là ou ce n'est pas utile. Entre autres parce que si le programme que tu tues a une shared memory, tu ne la récupères pas.
Quant à l'utilisation du $$, elle ne nous est pas utile puisqu'il s'agit du PID su shell d'origine. Or ce qu'il me faut, c'est le PID de la dernière tâche de fond, d'ou l'utilisation de $!.
a+
eric-
WebmasterS'il n'a pas de timeout, il y aura un timeout par défaut, donc à partir du moment ou il envoie un unique ping ou un nombre bien defini avec -c, il n'y aura aucun probléme, ce sera juste moins souple.
Pour le kill -9, je l'ai dis, c'est bourrin, mais s'il n'a pas prévu d'autre sortie, ça fonctionnera toujours, mon but était plus de donner une marche à suivre qu'une solution.
Pour l'utilisation de $$, c'est pas tout à fait ça ;-)
echo $$ à la ligne de commande te donnes effectivement le PID du shell. Dans un script en revanche, c'est le PID du script :-)
C'est, si ma mémoire est bonne, la variable spéciale correspondante au Parent Process ID (PPID)
@++♫ Il suffirait de presque rien...
-
-
Webmasteril ne s'arrette pas si je l'arrete pas .
Bah oui, mais comparé à la commande que tu lances dans ton script, y'a un petit détail quand même...ping -c 1 ip
Dans le script t'envoies un ping, si pas de réponse, tu fais ceci ou cela...
La commande que tu tapes au dessus, tu envoies des ping à l'infini, jusqu'à ce que tu demandes l'interruption (^C).
Donc Il faut rester sur un "ping -c 1" qui renvoi 0 en cas de réponse ou 1 en cas de timeout (0 et 1 étant accessibles par la variable spéciale $? qui contient le code retour de la derniere commande.)
Le 1 ou le zero tu t'en ballances, c'est geré par && et ||.
une autre variable utile est: $$ qui te donnes le PID du truc lancé.
-Donc dans un premier temps, quand tu lance ton script dans le cas ou l'ip ne répond plus au ping.
Il faut lancer le script s'il n'est pas déjà lancé.
Pour celà, tu fais un testif [ ! -e prog.pid ]
si le fichier prog.pid n'existe pas.
tu execute les script sinon, tu sors.
dans la suite du script (si prog.pid n'existe pas)
il faut le créer, et le remplir avec le pid du script.echo $$ > prog.pid
-Dans le second cas, le ping répond, ils faut donc arreter le prog si'il est en cours, ou ne rien faire.
Le test:if [ -e prog.pid ]
Si le fichier existe alors il faut quitter l'application puis supprimer le fichier.
sinon, on fais rien.kill -9 `cat prog.pid` rm -f prog.pid
Kill -9, c'est un peu bourrin, masi ça fonctionne si tu n'as rien prévu d'autre ;)
Pour optimiser le tout, il faudrais spécifier "-w 1" dans la commande ping.
C'est le time out en seconde, donc 1 parait raisonable enfin c'est reglable ;)
Pour le reste des iptimisation, il faut voir les man, surtout man bash!!!
@++♫ Il suffirait de presque rien...
-
si je lance un ping d'ip inconnu :
[root@mylinux root]# ping 192.168.0.40
PING 192.168.0.40 (192.168.0.40) from 192.168.0.1 : 56(84) bytes of data.
From 192.168.0.1 icmp_seq=1 Destination Host Unreachable
From 192.168.0.1 icmp_seq=2 Destination Host Unreachable
From 192.168.0.1 icmp_seq=3 Destination Host Unreachable
From 192.168.0.1 icmp_seq=4 Destination Host Unreachable
From 192.168.0.1 icmp_seq=5 Destination Host Unreachable
From 192.168.0.1 icmp_seq=6 Destination Host Unreachable
From 192.168.0.1 icmp_seq=7 Destination Host Unreachable
From 192.168.0.1 icmp_seq=8 Destination Host Unreachable
From 192.168.0.1 icmp_seq=9 Destination Host Unreachable
From 192.168.0.1 icmp_seq=10 Destination Host Unreachable
From 192.168.0.1 icmp_seq=11 Destination Host Unreachable
From 192.168.0.1 icmp_seq=12 Destination Host Unreachable
From 192.168.0.1 icmp_seq=13 Destination Host Unreachable
From 192.168.0.1 icmp_seq=14 Destination Host Unreachable
From 192.168.0.1 icmp_seq=15 Destination Host Unreachable
il ne s'arrette pas si je l'arrete pas . -
Et si tu ping une ip qui n'existe pas à partir d'un prompt, normalement, ton ping doit tomber en time-out et te rendre la main.
Est-ce le cas?
Sinon, suivant le man, as-tu un paramètre pour régler le timeout?
a+
eric -
Lorsque l'ip repond :
[root@mylinux root]# ./test3
+ unset PID
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
+ true
+ ping -c 1 -q 192.168.0.4
+ [[ 0 = 0 ]]
+ [[ ! -z '' ]]
+ sleep 3
Lorsque l'ip ne repond pas :
[root@mylinux root]# ./test3
+ unset PID
+ true
+ ping -c 1 -q 192.168.0.4
et rien de plus que c'est 3 lignes pour l'ip qui ne repond pas .
GreG -
Ajoute
set -x
en début de script, lance-le, laisse-le tourner au moins une minute sans y toucher et envoie-moi la sortie.
a+
eric -
Si j'ai bien compris il regarde si l'ip ping , puis si elle ne ping pas il lance sc_tranc_linux (mais c la qu'il s'arrette et ou je dois faire un ctrl + c) et si l'ip ping il ne lance pas l'application .
GreG -
Alors, il n'y a pas de raison que cela ne fonctionne pas. Je ne vois pas pourquoi tu dois taper ctrl+C pour sortir.
Est-ce que tu comprends bien ce que fait le script?
a+
eric -
sc_trans_linux fontionne en tache de fond une foi lancé il est totalement autonome . une lancé je peut refermer ma console il continera à tourner .
-
Si tu lances sc_trans_linux en tâches de fond à un pompt, normalement tu devrais récupérer la main tout de suite, avant la fin de l'exécution du programme. Est-ce le cas?
-
sc_trans_linux est un DSP qui permet d'emettre du son sur nos serveurs audios. Nous sommes une association. Et si la connection de notre studio principal plante c'est le blackout complet , je voudrais donc que sc_trans ce lance sur un de nos serveurs dédiés dans le but de reprendre le relais et empéché un blackout a l'antenne.
Donc comment faire pour qu'il ce lance lorsque le studio coupe pour que le sc_trans ce lance correctement ?
Cordiallement.
GreG -
Tu ne peux pas le lancer comme un cron job. Ca ne marchera pas.
Qu'y a-t-il dans ton sc_trans_linux?
a+
eric -
#!/bin/bash
unset PID
while true
do
ping -c 1 -q 192.168.0.4 > /dev/null
if [[ $? = 0 ]]
then
if [[ ! -z $PID ]]
then
kill $PID
unset PID
fi
else
if [[ -z $PID ]]
then
/home/GreG/sc_trans_040/sc_trans_linux /home/GreG/sc_trans_040/sc_trans.conf&
export PID=$!
fi
fi
sleep 3
done
Voila ce que j'ai mi. Mais il ne se lance malheuresement toujours pas , je doit toujours faire le Ctrl + c.
Et lorsque l'ip est Up je suis aussi obligé de faire Ctrl + C pour arretter le script, lors du lancement voila ce qui reste lance :
root 5298 0.0 0.2 4140 1084 pts/2 S 21:33 0:00 /bin/bash ./test3
root 5308 0.0 0.1 3952 556 pts/2 S 21:33 0:00 sleep 3
Ce n'est pas tres pratique car je vais mettre le script en crontab toute les minutes et donc il va rester bloqué et me faire une liste de process immense :(
Cordiallement.
GreG -
As-tu bien mis ton application en tache de fond? C'est le "&" de la ligne
echo "ceci est le programme"&
qui permet au script de continuer.
a+
eric -
Je me tire les cheveux et je vais commencer à ennuyer mon monde, mais cela pose toujours le meme probleme, apres le lancement du script il le lance pas l'application si on ne fait pas "Ctrl + c" je pense que c parce que l'application lance une console que cela fais cela :( .
Je commence vraiment à desperer apres differente manipulation cela ne fonctionne toujours pas.
[root@mylinux root]# ./test3
*******************************************************************************
** TRANScast Distributed Network Audio Content Provider
** Copyright (C) 2000 Nullsoft, Inc. All Rights Reserved.
** Use "sc_trans filename.conf" to specify a config file.
*******************************************************************************
l'espace blanc represente la où je suis obligé de faire Ctrl + c .
Eric etes vous connectez sur irc ou msn , je pense que cela serai plus simple et rapide .
Cordiallement.
GreG -
Voilà chef. Il y a probablement plus court et plus joli, mais ca doit faire ce que tu demandes.
unset PID
while true
do
ping -c 1 -q 192.168.1.100 > /dev/null
if [[ $? = 0 ]]
then
if [[ ! -z $PID ]]
then
kill $PID
unset PID
fi
else
if [[ -z $PID ]]
then
echo "ceci est le programme"&
export PID=$!
fi
fi
sleep 3
done
a+
eric -
#!/bin/bash
ping -q -c 2 192.168.0.4 >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "Aucun Probleme."
else
/home/GreG/sc_trans_040/sc_trans_linux /home/GreG/sc_trans_040/sc_trans.conf
fi
J'ai modifié le script mais j'ai toujours le probleme du Ctrl + C du msg au dessus et je n'arrive pas a trouver comme stoppé l'application lorsque l'ip est de retour.
Cordiallement.
GreG -
Ah autre petit souci :
[root@mylinux root]# ./test
ça marche
[root@mylinux root]#
La Aucun probleme car la machine ping bien. Par contre lorsque la machine ne ping plus :
[root@mylinux root]# ./test
Cela me laisse un blanc et je suis obligé de faire Ctrl + C pour que l'application ce lance.
*******************************************************************************
** TRANScast Distributed Network Audio Content Provider
** Copyright (C) 2000 Nullsoft, Inc. All Rights Reserved.
.
Je suis vraiment désolé de vous embettez avec cela, ce script sert a une association.
Cordiallement.
GreG -
Je vais essayer de m'expliker pour clairement.
Lorsque que l'ip Repond au ping alors rien ne ce passe.
Si l'Ip ne repond plus alors une application doit ce lancé.
Lorsque l'Ip repond de nouveau alors il faut que l'application lancé precedement soir killé et que plus aucune application ne soit lancé.
Cordiallement.
GreG
- 1
- 2
Suivant