Ik probeer een bash-script te schrijven in een bestand dat, wanneer het wordt uitgevoerd, een host begint te pingen totdat deze beschikbaar wordt , wanneer de host bereikbaar wordt, voert het een commando uit en stopt het met uitvoeren, ik heb geprobeerd er een te schrijven, maar het script blijft pingen totdat de telling eindigt,
Plus ik moet dat proces op de achtergrond plaatsen, maar als ik het script met het dollar ($
) teken dat het nog steeds op de voorgrond draait,
#!/bin/bash ping -c30 -i3 192.168.137.163 if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 else echo “fail” fi
Antwoord
Ik zou dit gebruiken, een simpele one-liner:
while ! ping -c1 HOSTNAME &>/dev/null; do echo "Ping Fail - `date`"; done ; echo "Host Found - `date`" ; /root/scripts/test1.sh
Vervang HOSTNAME
met de host die je probeert te pingen.
Ik heb het gedeelte gemist over het op de achtergrond zetten, zet die regel in een shellscript als volgt:
#!/bin/sh while ! ping -c1 $1 &>/dev/null do echo "Ping Fail - `date`" done echo "Host Found - `date`" /root/scripts/test1.sh
En om het op de achtergrond te gebruiken zou je het als volgt draaien:
nohup ./networktest.sh HOSTNAME > /tmp/networktest.out 2>&1 &
Vervang opnieuw HOSTNAME
met de host die u probeert te pingen. In deze benadering geef je de hostnaam als een argument door aan het shellscript.
Net als een algemene waarschuwing, als je host down blijft, zul je dit script continu op de achtergrond laten pingen totdat je het doodt of de gastheer is gevonden. Dus ik zou dat in gedachten houden wanneer je dit uitvoert. Omdat je systeembronnen zou kunnen opeten als je dit vergeet.
Opmerkingen
Antwoord
Door de parameters “-c 30” door te geven aan ping, zal het 30 ping proberen en stoppen. Het zal daarna controleren of de opdracht slaagt. Ik denk dat het het beste is om een lus te maken die één ping bevat en te controleren of deze ping lukt. Iets dergelijks:
while true; do ping -c1 google.com if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 fi done
Als je nog steeds op de voorgrond draait, en je bedoelt dat het nog steeds bezig is met afdrukken op de terminal, kun je stdin en stdout omleiden naar / dev / null.
Reacties
- Door de prompt te ontgrendelen zodat ik aan iets anders kan werken, tnx voor hulp
Answer
Een oud bericht, maar als suggestie kun je de optie -w
gebruiken om te pingen naar vermijd de lus. Bijvoorbeeld:
ping -w 30 -c 1 host
zal 30 seconden proberen met één ping per seconde (standaard ping heeft een interval van 1 seconde tussen pings) en wordt afgesloten bij de eerste succesvolle ping .
Als je geen time-out nodig hebt, wacht een eeuwigheid, gebruik gewoon een zeer grote waarde met -w
.
Answer
ping -oc 100000 Hostname > /dev/null && /root/scripts/test1.sh
-
ping -o
verlaat deping
nadat het eerste pakket is ontvangen -
> /dev/null
leidt de uitvoer om, zodat je het “niet ziet -
&&
zou het volgende commando uitvoeren als het vorige commando succesvol was
Bovendien kunt u elk proces op de achtergrond uitvoeren door het toevoegen van &
aan het einde ervan; echo "123" &
wordt bijvoorbeeld op de achtergrond uitgevoerd
Antwoord
Hier wordt gewerkt wijziging van uw script.
#!/bin/bash ping -c1 10.1.1.23 > /dev/null if [ $? -eq 0 ] then echo ok exit 0 else echo “fail” fi
U moet de uitvoer naar /dev/null
sturen zodat het niet verschijnt op het scherm.
-c
is bedoeld om te tellen. Als je -c30
invoert, ga je naar ping 30 keer voordat uw script naar de volgende regel kan gaan. Ik gebruik -c1
om het script sneller te laten werken.
-i
is om seconden te wachten tussen het verzenden van elk pakket. Dus -i3
is om 3 seconden te wachten. Ik verwijder -i
om het script sneller te laten werken.
Als laatste, maar niet in de laatste plaats, gebruik indentie zodat je code er goed uitziet en gemakkelijker te lezen is.
Voorbeelduitvoer
user@linux:~$ ./script.sh ok user@linux:~$ user@linux:~$ ./script.sh “fail” user@linux:~$
Antwoord
#!/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
Reacties
- Misschien wilt u ook om wat verklarende woorden toe te voegen …?
/tmp
, als de host uitvalt, ' ll uiteindelijk vullen/tmp
. Dat is meestal slecht nieuws …