Скрипт bash для запуска другого скрипта после 5 недоступных запросов ping на определенный IP-адрес или веб-сайт

Мне нужен скрипт для запуска другого скрипта после 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    

Всем спасибо, хороших дней.

Цикл 5 раз, добавляя коды состояния ($?). Если сумма > 0, то у вас есть как минимум 1 сбой в ваших 5 тестах. Если == 5, вы знаете, что это не удалось 5 раз.

Nic3500 08.02.2023 19:30

Кстати, вообще не используйте foo; if [ $? -eq 0 ]; then — вместо этого просто используйте if foo; then. Смотрите Почему тест $? чтобы увидеть, была ли команда успешной или нет анти-шаблона?

Charles Duffy 08.02.2023 19:44

Кроме того, вы, вероятно, захотите дополнять свой файл журнала, а не усекать его. И какова цель variable=$(echo "something"), когда вы могли бы использовать variable = "something"?

Charles Duffy 08.02.2023 19:45

Попробуйте использовать ping -c 5 .... Он должен возвращать хороший статус, если все 5 попыток проверки связи не увенчались успехом.

pjh 08.02.2023 19:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

#!/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-секундный сон после каждой попытки пинга, но вы можете настроить это.

Другие вопросы по теме