Bash ping-scriptfil til kontrol af værts tilgængelighed

Jeg prøver at skrive et bash-script i en fil, der, når det køres, begynder at pinge en vært, indtil den bliver tilgængelig , når værten bliver tilgængelig, kører den en kommando og holder op med at udføre, jeg prøvede at skrive en, men scriptet fortsætter med at pinge, indtil optællingen slutter,

Plus jeg skal sætte den proces i baggrunden, men hvis jeg kører script med dollaren ($) tegn det stadig kører i forgrunden,

#!/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 bruge dette, en simpel one-liner:

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

Udskift HOSTNAME med den vært, du prøver at pinge.


Jeg savnede den del om at sætte den i baggrunden, sæt linjen i et shellscript som sådan:

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

Og som baggrund vil du køre det sådan:

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

Udskift igen HOSTNAME med den vært, du prøver at pinge. I denne tilgang sender du værtsnavnet som et argument til shellscript.

Ligesom en generel advarsel, hvis din vært forbliver nede, vil du have dette script kontinuerligt ping i baggrunden, indtil du enten dræber det eller værten er fundet. Så jeg vil huske det, når du kører dette. Fordi du kan ende med at spise systemressourcer, hvis du glemmer det.

Kommentarer

  • Tnx til svaret og advarslen, dette er et visualiseret miljø så scriptet starter, når de fysiske servere starter, så VM ' s starter bestemt, men vil huske, hvis jeg sletter en VM, tnx igen
  • Især ved at logge fejlene hver gang og gemme al output i en fil i /tmp, hvis værten går ned, ' ll ender med at udfylde /tmp. Det har en tendens til at være dårlige nyheder …

Svar

Ved at videregive parametrene “-c 30” til ping, det prøver 30 ping og stopper. Den kontrollerer efter, om kommandoen lykkes. Jeg synes det er bedst at lave en loop, der indeholder en ping og kontrollere, om dette ping lykkes. Noget som det:

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

Hvis du stadig kører i forgrunden, mener du, at det stadig udskrives på terminalen, kan du omdirigere stdin og stdout til / dev / null.

Kommentarer

  • Ved at låse prompt op, så jeg kunne arbejde på noget andet, tnx for hjælp

Svar

Et gammelt indlæg, men som et forslag kan du bruge indstillingen -w til ping til undgå løkken. For eksempel vil

ping -w 30 -c 1 host 

prøve i 30 sekunder med en ping pr. Sekund (standard-ping har 1 sekund interval mellem pings) og afslutter ved den første vellykkede ping .

Hvis du ikke har brug for en timeout, venter jeg altid, brug bare en meget stor værdi med -w.

Svar

ping -oc 100000 Hostname > /dev/null && /root/scripts/test1.sh 
  • ping -o forlader ping efter at den første pakke er modtaget
  • > /dev/null omdirigerer output, så du vil ikke se det
  • && kører den næste kommando, hvis den forrige kommando er vellykket

Derudover kan du køre enhver proces i baggrunden ved at tilføje & til slutningen af det; for eksempel echo "123" & kører i baggrunden

Svar

Her fungerer ændring af dit script.

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

Du skal sende output til /dev/null, så det ikke vises på skærmen.

-c er beregnet til optælling. Hvis du lægger -c30, går du til ping 30 gange før dit script kan gå videre til næste linje. Jeg bruger -c1 for at få scriptet til at køre hurtigere.

-i er at vente sekunder mellem at sende hver pakke. Så -i3 er at vente 3 sekunder. Jeg fjerner -i for at få scriptet til at køre hurtigere.

Sidst men ikke mindst skal du bruge indtryk, så din kode ser flot og lettere at læse ud.

Eksempeludgang

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 måske også have at tilføje nogle forklarende ord …?

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *