Мне нужен скрипт для запуска другого скрипта после 5 последовательно «недоступных» ответов от ping на определенный IP-адрес. Но если все в порядке, ничего не делать. Например, сейчас у меня есть скрипт, запускающий команду ping, беря IP-адреса из текстового файла, в котором есть список IP-адресов или веб-сайтов. И этот скрипт запускает другой скрипт отправки сообщения телеграммы, если IP-адрес или веб-сайт из списка недоступен. Но это не очень хорошая идея, потому что часто может быть только 1 неотзывчивый ответ, но в целом веб-сайт работает или IP-адрес доступен. Теперь мне нужен скрипт, который запускает скрипт отправки сообщений телеграммы после последовательно 5 недостижимых ответов. Не после 1 недостижимого ответа. Вот мой сценарий:
date
cat /home/user/list.txt | while read output
do
ping -c 1 "$output" > /dev/null
if [ $? -eq 0 ]; then
echo "node $output is up"
else
message = "$(echo "node $output is down")"
echo "node $output is down" > /home/user/siteDown.log
telegram-send "$message"
fi
done
Всем спасибо, хороших дней.
Кстати, вообще не используйте foo; if [ $? -eq 0 ]; then
— вместо этого просто используйте if foo; then
. Смотрите Почему тест $? чтобы увидеть, была ли команда успешной или нет анти-шаблона?
Кроме того, вы, вероятно, захотите дополнять свой файл журнала, а не усекать его. И какова цель variable=$(echo "something")
, когда вы могли бы использовать variable = "something"
?
Попробуйте использовать ping -c 5 ...
. Он должен возвращать хороший статус, если все 5 попыток проверки связи не увенчались успехом.
Попробуй это:
#!/bin/sh
try_ping() {
i=0
while [ $((i+=1)) -le 5 ] ; do
ping -c 1 "${1}" > /dev/null \
&& return 0
sleep 0.5
done
return 1
}
date
while read -r output ; do
if try_ping "${output}" ; then
echo "node $output is up"
else
echo "node $output is down" >> /home/user/siteDown.log
telegram-send "node $output is down"
fi
done </home/user/list.txt
Я добавил 0,5-секундный сон после каждой попытки пинга, но вы можете настроить это.
Цикл 5 раз, добавляя коды состояния ($?). Если сумма > 0, то у вас есть как минимум 1 сбой в ваших 5 тестах. Если == 5, вы знаете, что это не удалось 5 раз.