Snažím se napsat bash skript do souboru, který by při spuštění začal pingovat hostitele, dokud nebude k dispozici , když se hostitel stane dosažitelným, spustí příkaz a přestane vykonávat, zkusil jsem napsat jeden, ale skript pokračuje v ping, dokud počet neskončí,
Navíc musím tento proces dát na pozadí, ale pokud spustím skript se znakem dolaru ($
) stále běží v popředí,
#!/bin/bash ping -c30 -i3 192.168.137.163 if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 else echo “fail” fi
odpověď
Použil bych tuto jednoduchou liniovou linku:
while ! ping -c1 HOSTNAME &>/dev/null; do echo "Ping Fail - `date`"; done ; echo "Host Found - `date`" ; /root/scripts/test1.sh
Nahradit HOSTNAME
s hostitelem, na kterého se pokoušíte ping.
Stýskalo se mi o jeho umístění na pozadí, vložte tento řádek do skriptu takto:
#!/bin/sh while ! ping -c1 $1 &>/dev/null do echo "Ping Fail - `date`" done echo "Host Found - `date`" /root/scripts/test1.sh
A na pozadí byste jej spustili takto:
nohup ./networktest.sh HOSTNAME > /tmp/networktest.out 2>&1 &
Znovu nahraďte HOSTNAME
s hostitelem, na kterého se pokoušíte ping. V tomto přístupu předáváte název hostitele jako argument skriptu shellscript.
Stejně jako obecné varování, pokud váš hostitel zůstane nefunkční, budete mít tento skript neustále ping na pozadí, dokud ho nezabijete nebo hostitel je nalezen. Když to spustíte, pamatuji si to. Protože byste na to mohli zapomenout, pokud na to zapomenete.
Komentáře
Odpovědět
Předáním parametrů „-c 30“ do ping, zkusí to 30 ping a zastaví se. Poté zkontroluje, zda je příkaz úspěšný. Myslím, že je nejlepší udělat smyčku, která obsahuje jeden ping a zkontrolovat, zda je tento ping úspěšný. Něco takového:
while true; do ping -c1 google.com if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 fi done
Pokud stále běžíte v popředí, máte na mysli, že stále tiskne na terminálu, můžete přesměrovat stdin a stdout na / dev / null.
Komentáře
- Odemknutím výzvy, abych mohl pracovat na něčem jiném, požádejte o pomoc tnx
Odpověď
Starý příspěvek, ale jako návrh můžete použít možnost -w
na ping vyhnout se smyčce. Například
ping -w 30 -c 1 host
se pokusí o 30 sekund s jedním pingem za sekundu (výchozí ping má interval 1 s mezi pingy) a ukončí se při prvním úspěšném pingu .
Pokud nepotřebujete vypršení časového limitu, počkejte navždy, stačí použít velmi velkou hodnotu pomocí -w
.
Odpověď
ping -oc 100000 Hostname > /dev/null && /root/scripts/test1.sh
-
ping -o
opustíping
po přijetí prvního paketu -
> /dev/null
přesměrovává výstup, takže ho neuvidíte -
&&
spustí další příkaz, pokud byl předchozí příkaz úspěšný
Kromě toho můžete spustit jakýkoli proces na pozadí přidání &
na konec; například echo "123" &
poběží na pozadí
Odpověď
Zde funguje úprava skriptu.
#!/bin/bash ping -c1 10.1.1.23 > /dev/null if [ $? -eq 0 ] then echo ok exit 0 else echo “fail” fi
Musíte odeslat výstup na /dev/null
, aby se na něm nezobrazil obrazovka.
-c
je určen pro počet. Pokud zadáte -c30
, přejdete na ping 30 krát, než může skript přejít na další řádek. Používám -c1
k rychlejšímu spuštění skriptu.
-i
je počkat několik sekund mezi odesláním každého paketu. -i3
je tedy počkat 3 sekundy. Odstraním -i
, aby se skript běžel rychleji.
V neposlední řadě použijte indention, aby váš kód vypadal hezky a lépe čitelný.
Ukázkový výstup
user@linux:~$ ./script.sh ok user@linux:~$ user@linux:~$ ./script.sh “fail” user@linux:~$
Odpovědět
#!/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
Komentáře
- Můžete také chtít přidat vysvětlující slova …?
/tmp
, pokud hostitel selže ' ll nakonec vyplňte/tmp
. To bývá špatná zpráva …