Încerc să scriu un script bash într-un fișier care, atunci când rulează, începe să pingă o gazdă până când devine disponibil , când gazda devine accesibilă, execută o comandă și se oprește din executare, am încercat să scriu una, dar scriptul continuă să pingă până când contorul se termină,
În plus, trebuie să pun acest proces în fundal, dar dacă rulez scriptul cu semnul dolar ($
) rulează încă în prim-plan,
#!/bin/bash ping -c30 -i3 192.168.137.163 if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 else echo “fail” fi
Răspuns
Aș folosi acest lucru, un simplu liner:
while ! ping -c1 HOSTNAME &>/dev/null; do echo "Ping Fail - `date`"; done ; echo "Host Found - `date`" ; /root/scripts/test1.sh
Înlocuiți HOSTNAME
cu gazda pe care încercați să faceți ping.
Mi-a fost dor de partea de a-l pune în fundal, a pus acea linie într-un shellscript astfel:
#!/bin/sh while ! ping -c1 $1 &>/dev/null do echo "Ping Fail - `date`" done echo "Host Found - `date`" /root/scripts/test1.sh
Și pentru fundal l-ați rula astfel:
nohup ./networktest.sh HOSTNAME > /tmp/networktest.out 2>&1 &
Înlocuiți din nou HOSTNAME
cu gazda pe care încercați să faceți ping. În această abordare, treceți numele gazdei ca argument către shellscript.
La fel ca un avertisment general, dacă gazda dvs. rămâne oprită, veți avea acest script ping continuu în fundal până când îl veți ucide sau gazda este găsită. Așadar, aș ține cont de asta atunci când rulați acest lucru. Deoarece puteți ajunge să mâncați resurse de sistem dacă uitați de acest lucru.
Comentarii
Răspuns
Prin trecerea parametrilor „-c 30” la ping, va încerca 30 de ping și se va opri. Se va verifica după ce comanda reușește. Cred că este mai bine să faceți o buclă care conține un ping și să verificați dacă acest ping reușește. Ceva de genul acesta:
while true; do ping -c1 google.com if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 fi done
Dacă rulați încă în prim-plan, vrei să spui că încă se tipărește pe terminal, poți redirecționa stdin și stdout către / dev / null.
Comentarii
- Deblocând solicitarea pentru a putea lucra la altceva, tnx pentru ajutor
Răspuns
O postare veche, dar ca sugestie puteți utiliza opțiunea -w
pe ping la evita bucla. De exemplu,
ping -w 30 -c 1 host
va încerca timp de 30 de secunde cu un ping pe secundă (ping-ul implicit are un interval de 1 secundă între ping) și va ieși din primul ping de succes .
Dacă nu aveți nevoie de un timeout, adică aștept veșnic, folosiți doar o valoare foarte mare cu -w
.
Răspuns
ping -oc 100000 Hostname > /dev/null && /root/scripts/test1.sh
-
ping -o
iese dinping
după primirea primului pachet -
> /dev/null
redirecționează ieșirea, deci nu o veți vedea -
&&
ar rula următoarea comandă, dacă comanda anterioară a avut succes
În plus, puteți rula orice proces în fundal prin adăugarea &
la sfârșitul acestuia; de exemplu, echo "123" &
va rula în fundal
Răspuns
Aici funcționează modificarea scriptului dvs.
#!/bin/bash ping -c1 10.1.1.23 > /dev/null if [ $? -eq 0 ] then echo ok exit 0 else echo “fail” fi
Trebuie să trimiteți rezultatul către /dev/null
, astfel încât să nu apară pe ecranul.
-c
este destinat numărării. Dacă puneți -c30
, veți merge la ping 30 de câteva ori înainte ca scriptul dvs. să poată trece la rândul următor. Folosesc -c1
pentru a face scriptul să ruleze mai repede.
-i
este să aștept câteva secunde între trimiterea fiecărui pachet. Deci, -i3
trebuie să aștepte 3 secunde. Îndepărt -i
pentru ca scriptul să ruleze mai repede.
Nu în ultimul rând, folosiți indentarea, astfel încât codul dvs. să arate frumos și mai ușor de citit.
Exemplu de ieșire
user@linux:~$ ./script.sh ok user@linux:~$ user@linux:~$ ./script.sh “fail” user@linux:~$
Răspuns
#!/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
Comentarii
- De asemenea, ați putea dori pentru a adăuga câteva cuvinte explicative …?
/tmp
, dacă gazda coboară ' ll ajunge să umple/tmp
. Aceasta tinde să fie o veste proastă …