Bash ping-skriptfil for å sjekke tilgjengeligheten av verten

Jeg prøver å skrive et bash-skript i en fil som når du kjører begynner å pinge en vert til den blir tilgjengelig , når verten blir tilgjengelig, kjører den en kommando og slutter å kjøre, jeg prøvde å skrive en, men skriptet fortsetter å pinge til tellingen slutter,

I tillegg må jeg sette den prosessen i bakgrunnen, men hvis jeg kjører skript med dollar ($) tegn det fortsatt kjører i forgrunnen,

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

Svar

Jeg vil bruke dette, en enkel en-liner:

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

Erstatt HOSTNAME med verten du prøver å pinge.


Jeg savnet delen om å sette den i bakgrunnen, legg den linjen i et shellscript slik:

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

Og som bakgrunn vil du kjøre det slik:

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

Erstatt igjen HOSTNAME med verten du prøver å pinge. I denne tilnærmingen sender du vertsnavnet som et argument til shellscript.

Akkurat som en generell advarsel, hvis verten din holder seg nede, vil du ha dette skriptet kontinuerlig pingende i bakgrunnen til du enten dreper det eller verten er funnet. Så jeg vil ha det i bakhodet når du kjører dette. Fordi du kan ende opp med å spise systemressurser hvis du glemmer dette.

Kommentarer

  • Tnx for svaret og advarselen, dette er et visualisert miljø så skriptet starter etter at de fysiske serverne har startet opp, så VM ' s vil starte, men vil huske hvis jeg sletter en VM, tnx igjen
  • Spesielt ved å logge feilene hver gang, og lagre all utdata i en fil i /tmp, hvis verten går ned, vil du ' ll ender opp med å fylle /tmp. Det har en tendens til å være dårlige nyheter …

Svar

Ved å sende parametrene «-c 30» til ping, den vil prøve 30 ping og stopp. Det vil sjekke etter om kommandoen lykkes. Jeg tror det er best å gjøre en sløyfe som inneholder ett ping og sjekke om dette ping lykkes. Noe sånt:

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

Hvis du fremdeles løper i forgrunnen, mener du at den fremdeles skrives ut på terminalen, kan du omdirigere stdin og stdout til / dev / null.

Kommentarer

  • Ved å låse opp meldingen slik at jeg kan jobbe med noe annet, tnx for hjelp

Svar

Et gammelt innlegg, men som et forslag kan du bruke alternativet -w på ping til unngå løkken. For eksempel,

ping -w 30 -c 1 host 

vil prøve i 30 sekunder med ett ping per sekund (standard ping har 1 sekund intervall mellom ping) og vil gå ut på den første vellykkede pingen .

Hvis du ikke trenger en tidsavbrudd, vil du vente for alltid, bare bruk en veldig stor verdi med -w.

Svar

ping -oc 100000 Hostname > /dev/null && /root/scripts/test1.sh 
  • ping -o går ut av ping etter at den første pakken er mottatt
  • > /dev/null omdirigerer utdataene, slik at du ikke ser det
  • && vil kjøre neste kommando, hvis den forrige kommandoen er vellykket

I tillegg kan du kjøre hvilken som helst prosess i bakgrunnen ved legge til & på slutten av den; for eksempel echo "123" & kjører i bakgrunnen

Svar

Her fungerer endring av skriptet ditt.

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

Du må sende utdata til /dev/null så den ikke vises på skjermen.

-c er ment for telling. Hvis du setter -c30, skal du til ping 30 ganger før skriptet ditt kan gå videre til neste linje. Jeg bruker -c1 for å få skriptet til å løpe raskere.

-i er å vente sekunder mellom å sende hver pakke. Så -i3 er å vente i 3 sekunder. Jeg fjerner -i for å få skriptet til å kjøre raskere.

Sist men ikke minst, bruk innrykk slik at koden din ser fin ut og lettere å lese.

Eksempelutgang

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 vil kanskje også ha for å legge til noen forklarende ord …?

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *