Bash ping-skriptfil för att kontrollera värdtillgänglighet

Jag försöker skriva ett bash-skript i en fil som, när den körs, börjar pinga en värd tills den blir tillgänglig , när värden nås körs ett kommando och slutar köra, jag försökte skriva ett men skriptet fortsätter att pinga tills räkningen är slut,

Plus jag måste sätta den processen i bakgrunden men om jag kör skript med dollartecknet ($) tecknet att det fortfarande körs i förgrunden,

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

Svar

Jag skulle använda det här, en enkel enlinje:

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

Ersätt HOSTNAME med värden som du försöker pinga.


Jag saknade delen om att sätta den i bakgrunden, lägg den raden i ett shellscript så:

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

Och som bakgrund skulle du köra det så:

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

Byt ut igen HOSTNAME med värden du försöker pinga. I detta tillvägagångssätt skickar du värdnamnet som ett argument till shellscript.

Precis som en allmän varning, om din värd förblir nere, kommer du att ha det här skriptet kontinuerligt pingande i bakgrunden tills du antingen dödar det eller värden hittas. Så jag skulle ha det i åtanke när du kör det här. Eftersom du kan sluta äta systemresurser om du glömmer bort detta.

Kommentarer

  • Tnx för svaret och varningen, detta är en visualiserad miljö så skriptet startar efter att de fysiska servrarna startat så att VM ' startar säkert, men kommer ihåg om jag tar bort en virtuell dator, tnx igen
  • I synnerhet genom att logga fel varje gång och lagra all utdata i en fil i /tmp, om värden går ner kommer du ' ll slutar fylla /tmp. Det tenderar att vara dåliga nyheter …

Svar

Genom att skicka parametrarna ”-c 30” till ping, det försöker 30 ping och stoppar. Det kommer att kontrollera om kommandot lyckas. Jag tycker att det är bäst att göra en slinga som innehåller en ping och kontrollera om det här ping lyckas. Något liknande:

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

Om du fortfarande kör i förgrunden menar du att den fortfarande skrivs ut på terminalen kan du omdirigera stdin och stdout till / dev / null.

Kommentarer

  • Genom att låsa upp prompten så att jag kan arbeta med något annat, tnx för hjälp

Svar

Ett gammalt inlägg, men som ett förslag kan du använda alternativet -w vid ping till undvik slingan. Till exempel

ping -w 30 -c 1 host 

försöker i 30 sekunder med en ping per sekund (standardping har ett sekundintervall mellan ping) och avslutas vid den första framgångsrika pingen .

Om du inte behöver en timeout, väntar jag alltid, använd bara ett mycket stort värde med -w.

Svar

ping -oc 100000 Hostname > /dev/null && /root/scripts/test1.sh 
  • ping -o lämnar ping efter att det första paketet har tagits emot
  • > /dev/null omdirigerar utdata så att du inte ser det
  • && skulle köra nästa kommando, om det tidigare kommandot lyckades

Dessutom kan du köra valfri process i bakgrunden genom att lägga till & i slutet av den; till exempel echo "123" & körs i bakgrunden

Svar

Här fungerar modifiering av ditt skript.

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

Du måste skicka utdata till /dev/null så att den inte visas på skärmen.

-c är tänkt att räkna. Om du lägger till -c30, går du till ping 30 gånger innan ditt skript kan gå vidare till nästa rad. Jag använder -c1 för att skriptet ska gå snabbare.

-i är att vänta sekunder mellan att skicka varje paket. Så -i3 är att vänta 3 sekunder. Jag tar bort -i för att skriptet ska gå snabbare.

Sist men inte minst, använd fördjupning så att din kod ser fin ut och lättare att läsa.

Exempelutdata

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

Svar

#!/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 

Kommentarer

  • Du kanske också vill ha att lägga till några förklarande ord …?

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *