Bash file script ping per verificare la disponibilità dellhost

Sto cercando di scrivere uno script bash in un file che, quando viene eseguito, avvia il ping di un host finché non diventa disponibile , quando lhost diventa raggiungibile esegue un comando e ne interrompe lesecuzione, ho provato a scriverne uno ma lo script continua a eseguire il ping fino al termine del conteggio,

Inoltre devo mettere quel processo in background ma se eseguo il script con il simbolo del dollaro ($) viene ancora eseguito in primo piano,

#!/bin/bash ping -c30 -i3 192.168.137.163 if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 else echo “fail” fi 

Risposta

Io userei questo, un semplice one-liner:

while ! ping -c1 HOSTNAME &>/dev/null; do echo "Ping Fail - `date`"; done ; echo "Host Found - `date`" ; /root/scripts/test1.sh 

Sostituisci HOSTNAME con lhost a cui stai tentando di eseguire il ping.


Mi sono perso la parte su come metterlo in background, metti quella riga in uno shellscript in questo modo:

#!/bin/sh while ! ping -c1 $1 &>/dev/null do echo "Ping Fail - `date`" done echo "Host Found - `date`" /root/scripts/test1.sh 

E per metterlo in background dovresti eseguirlo in questo modo:

nohup ./networktest.sh HOSTNAME > /tmp/networktest.out 2>&1 & 

Sostituisci di nuovo HOSTNAME con lhost a cui stai tentando di eseguire il ping. In questo approccio stai passando il nome host come argomento allo script di shell.

Proprio come un avvertimento generale, se il tuo host rimane inattivo, questo script eseguirà continuamente il ping in background finché non lo ucciderai o lhost viene trovato. Quindi lo terrò a mente quando lo esegui. Perché potresti finire per consumare risorse di sistema se ti dimentichi di questo.

Commenti

  • Tnx per la risposta e lavvertimento, questo è un ambiente visualizzato quindi lo script verrà avviato dopo lavvio dei server fisici, quindi la VM ' si avvierà sicuramente, ma lo terrò a mente se elimino una VM, tnx di nuovo
  • In particolare registrando ogni volta gli errori e archiviando tutto loutput in un file in /tmp, se lhost non funziona, ' ll finiscono per riempire /tmp. Questa tende a essere una cattiva notizia …

Risposta

Passando i parametri “-c 30” a ping, proverà 30 ping e si fermerà. Controllerà dopo se il comando ha esito positivo. Penso che sia meglio fare un ciclo che contiene un ping e controllare se questo ping ha successo. Qualcosa del genere:

while true; do ping -c1 google.com if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 fi done 

Se ancora in esecuzione in primo piano, vuoi dire che sta ancora stampando sul terminale, puoi reindirizzare stdin e stdout a / dev / null.

Commenti

  • Sbloccando il prompt in modo che io possa lavorare su qualcosaltro, tnx per aiuto

Risposta

Un vecchio post, ma come suggerimento puoi utilizzare lopzione -w su ping a evitare il ciclo. Ad esempio,

ping -w 30 -c 1 host 

proverà per 30 secondi con un ping al secondo (il ping predefinito ha un intervallo di 1 secondo tra i ping) e terminerà al primo ping riuscito .

Se non hai bisogno di un timeout, cioè aspetta sempre, usa un valore molto grande con -w.

Risposta

ping -oc 100000 Hostname > /dev/null && /root/scripts/test1.sh 
  • ping -o esce da ping dopo aver ricevuto il primo pacchetto
  • > /dev/null reindirizza loutput, quindi non lo “vedrai”
  • && eseguirà il comando successivo, se il comando precedente ha avuto successo

Inoltre, puoi eseguire qualsiasi processo in background aggiungendo & alla fine; ad esempio, echo "123" & verrà eseguito in background

Risposta

Funziona qui modifica del tuo script.

#!/bin/bash ping -c1 10.1.1.23 > /dev/null if [ $? -eq 0 ] then echo ok exit 0 else echo “fail” fi 

Devi inviare loutput a /dev/null in modo che “non venga visualizzato lo schermo.

-c serve per contare. Se metti -c30, “stai per eseguire il ping 30 volte prima che il tuo script possa passare alla riga successiva. Uso -c1 per rendere lo script più veloce.

-i è di attendere secondi tra linvio di ogni pacchetto. Quindi -i3 deve attendere 3 secondi. Rimuovo -i per rendere lo script più veloce.

Ultimo ma non meno importante, usa il rientro in modo che il tuo codice sia bello e più facile da leggere.

Esempio di output

user@linux:~$ ./script.sh ok user@linux:~$ user@linux:~$ ./script.sh “fail” user@linux:~$ 

Risposta

#!/bin/sh if [ $1 ] then for i in ` cat $1` do VAR1=$(ping -ac 2 $i| grep -c error) if [ $VAR1 == "0" ] then echo " valid : $i" else echo " invalid : $i" fi done else echo " please present the file name. example: pong /tmp/a " fi 

Commenti

  • Potresti anche volere per aggiungere alcune parole esplicative …?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *