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
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ämnarping
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 …?
/tmp
, om värden går ner kommer du ' ll slutar fylla/tmp
. Det tenderar att vara dåliga nyheter …