2016-07-20 9 views
0

Я хочу написать скрипт, чтобы проверить, встал ли сервер, а если нет, спать в течение 30 секунд и снова пинговать. Но я хочу, чтобы он повторял цикл в течение 10 минут или 20 раз. Мне нужно использовать это, потому что мой другой скрипт обновляет компьютер и перезагружается система, поэтому мне нужно ждать, пока он вернется. Я не хочу устанавливать огромное время сна, потому что это просто неэффективно.Проверьте, не зашел ли сервер

Я пинг 0.0.0.0 как пример.

Заранее благодарен!

#!/usr/bin/expect -f 
set timeout 30 
set max_try 20 
set tries 0 
spawn ping 0.0.0.0 

expect { 
    "64 bytes from 0.0.0.0" puts "servers are up" 
    if [ $tries -eq $max_try ]; then 
      puts "Test machine taking too long to reboot" 
      exit 
    fi 
    timeout {incr tries;exp_continue} 
} 
puts "Going to exit now" 
exit 
+0

** Стандартная оговорка: ** Ping проверяет только, если сетевой интерфейс встал, а не если какой-либо реальный сервис в системе. Я видел системы, которые реагировали на пинг, несмотря на то, что они полностью непригодны (из-за нарушения всех пользовательских процессов). Любое решение по мониторингу, будь то временное, как в том, что вы делаете, или постоянное, как в чем-то вроде nagios, _needs_, чтобы иметь в виду такие вещи или результаты, которые оно будет доставлять, будет полностью поддельным. –

ответ

2

Я бы предположил, что вам не нужно этого ожидать. В Баш

function ping1 { 
    command ping -c 1 -W 1 "$1" >/dev/null 
} 

function ping2 { 
    if ! ping1 "$1"; then 
     sleep 120 
     ping1 "$1" 
    fi 
} 

host="0.0.0.0" 
if ping2 "$host"; then 
    echo "$host is up" 
else 
    echo "$host is down" 
fi 

новые требования

function ping_many { 
    local tries=$1 host=$2 sleep=$3 
    while ((tries-- > 0)) && ! ping1 "$host"; do 
     sleep "$sleep" 
    done 
    return $((! (tries >= 0))) # have to invert the boolean value to a success/fail value 
} 

ping_many 20 0.0.0.0 30 
+0

Спасибо, это сработало, но я просто понял, что с 2-минутным осмотром слишком много времени. Я перешел на проверку до 30 секунд, и у меня цикл 20 раз. Я знаю, что я не могу сделать 20 новых fuctions. –

+0

Ответ обновлен. –

0

Я понял это, в случае, если кто-либо заинтересован. \ 003 означает ctrl + c

#!/usr/bin/expect -f 
set timeout 5 
set max_try 20 
for {set i 0} {$i < $max_try} {incr i 1} { 
     puts "loop $i" 
     spawn ping -c 2 -i 3 -W 1 0.0.0.0 
     expect { 
       "2 packets transmitted, 2 received" {puts "servers are up"; break} 
       timeout {send \003} 
     } 
     sleep 30 
} 
puts "about to exit now"; 
exit