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
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 daping
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 …?
/tmp
, se lhost non funziona, ' ll finiscono per riempire/tmp
. Questa tende a essere una cattiva notizia …