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
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
forladerping
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 …?
/tmp
, hvis værten går ned, ' ll ender med at udfylde/tmp
. Det har en tendens til at være dårlige nyheder …