Aide ScriptShell :(

Fermé
GreG - 8 juil. 2004 à 15:25
 GreG - 17 juil. 2004 à 13:44
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

25 réponses

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
0
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 .
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
9 juil. 2004 à 03:39
il 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 test
if [ ! -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...
0
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
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
9 juil. 2004 à 21:41
S'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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
0