Создайте bash-скрипт для пинга

Вопрос или проблема

Добрый вечер
Мне нужен скрипт на bash, который будет выполнять следующую команду:
ping -c 4 -i "IP" 3 раза. Каждый ping должен выполняться с интервалом 10 минут, и только если он терпит неудачу все 3 раза, он отправляет электронное письмо. Можете помочь мне?

Например.

ping -c 4 -i X.X.X.X

Тип выполнения: первый ping, если все пакеты потеряны, подождите 10 минут и выполните команду ping снова, если все равно неудача, повторите последний ping, и если снова неудача, отправьте электронное письмо

#!/bin/bash
HOSTS="X.X.X.X"

pingtest(){
  for myHost in "$@"
  do
    ping -c 4 -i 5 $HOSTS && return 1
  done
  return 0
}

if pingtest $HOSTS
then
  # 100% неудача
  echo "Сервер не отвечает" | mail -s "Сервер недоступен" [email protected]

fi

Но как можно повторить это 3 раза и только после того, как произойдет потеря пакетов, отправить электронное письмо?
Спасибо

Если использование внешней программы приемлемо, вы можете использовать monitor-ip. Он написан на C и достаточно конфигурируемый. В отличие от bash скрипта, который выполняет цикл и постоянно исполняет ping или cron задачу, он может выполнять сотни ping в секунду, потребляя менее 1% времени CPU.

Например, вы можете использовать что-то вроде этого:

sudo ./monitor-ip --interval 5.0 --missed-max 20 --reset -- 1.2.3.4 \
        bash -c 'mail -s "Сервер недоступен!" [email protected] <<< "$MONITOR_NOTIFY_REMOTE_ADDRESS недоступен"'

Это будет отправлять ping к 1.2.3.4 с интервалом в 5 секунд, пока не будет получено 20 последовательных ответов (1 минута простоя), затем отправит электронное письмо на [email protected]. Он продолжит отправлять электронные письма с интервалом в 1 минуту, пока состояние не будет разрешено.

Честное признание: я написал monitor-ip.

Вот пример того, как получить результат от ping:

#!/bin/bash

HOST="X.X.X.X"
WAITFOR=5
TIMES=3

ping $HOST -c $TIMES -i $WAITFOR &> /dev/null
pingReturn=$?

if [ $pingReturn -eq 0 ]; then
    # Работает
    echo "Успех!!!"
    exit 0
else
    # Нет доступа
    echo "Ошибка"
    exit 1
fi

Вы можете использовать свой метод для отправки электронной почты вместо echo, который я вставил. У вас также есть три переменные HOST, TIMES и WAITFOR, которые вы можете установить на желаемые значения. Если вам нужно 10 минут между ping, вы должны установить WAITFOR на значение 600.

Ниже приведенный скрипт работает хорошо для следующих сценариев

 #!/bin/bash
    echo "Введите имя хоста или IP адрес хоста"
    read h
    ping -c1 $h
    if [ $? != 0 ]
    then
    sleep 6
    ping -c1 $h
    if [ $? != 0 ]
    then
    sleep 6
    ping -c1 $h
    if [ $? != 0 ]
    then
    echo "хост $h не отвечает и он недоступен"
    mail -s "хост $h не отвечает и он недоступен" emailid </dev/null
    else
    echo "хост $h отвечает"
    fi
    fi
    fi

Ответ или решение

Создание скрипта на Bash для проверки доступности хоста с помощью команды ping является достаточно распространенной задачей в области системного администрирования. В данном ответе я подробно объясню, как можно реализовать такой скрипт, который будет пинговать указанный IP-адрес три раза с интервалом в 10 минут и отправлять уведомление по электронной почте в случае полной потери пакетов.

Структура скрипта

  1. Определение хоста и переменных.
  2. Функция для выполнения ping и проверки результатов.
  3. Цикл для повторных попыток с ожиданием.
  4. Отправка уведомления по электронной почте.

Пример скрипта

#!/bin/bash

# Определите переменные
HOST="X.X.X.X"  # Замените этот IP-адрес на нужный
EMAIL="youremail@example.com"  # Замените на ваш e-mail
PING_COUNT=4  # Количество попыток пинга
DELAY=600  # Задержка в секундах (10 минут)

# Функция для выполнения пинга
ping_test() {
  ping -c $PING_COUNT $HOST &> /dev/null  # Выполните команду ping и перенаправьте вывод
  return $?  # Возврат успешного (0) или неуспешного (не 0) кода
}

# Цикл для трижды проверки доступности
for i in {1..3}; do
  echo "Попытка №$i..."
  ping_test  # Проверка доступности

  if [ $? -eq 0 ]; then
    echo "Хост $HOST доступен."
    exit 0  # Если пинг успешен, выходим из скрипта
  fi

  echo "Хост $HOST недоступен. Ожидание $DELAY секунд перед следующей попыткой..."
  sleep $DELAY  # Ждем 10 минут (600 секунд)
done

# Если все три попытки завершились неудачей
echo "Все три попытки не удались. Отправка уведомления на $EMAIL."
echo "Хост $HOST недоступен." | mail -s "Сообщение: Хост недоступен" $EMAIL

Пояснение

  1. Определение переменных:

    • HOST – IP-адрес или имя хоста, который вы хотите проверить.
    • EMAIL – адрес электронной почты, на который будет отправлено уведомление.
    • PING_COUNT – количество отправленных пакетов в одном запросе.
    • DELAY – время в секундах, в течение которого скрипт будет ждать между попытками.
  2. Функция ping_test:

    • Выполняет команду ping и перенаправляет вывод в /dev/null, чтобы избежать ненужной информации на экране.
    • Возвращает код завершения, который указывает на успешность операции.
  3. Цикл for:

    • Выполняет проверку доступности в три этапа. Если пинг успешен, скрипт выводит сообщение об этом и завершает свою работу.
    • Если пинг неуспешен, скрипт ждет 10 минут перед следующей попыткой.
  4. Отправка уведомления по электронной почте:

    • Если все три попытки не увенчались успехом, скрипт отправляет уведомление о недоступности хоста на указанный адрес электронной почты.

Установка и запуск скрипта

  1. Скопируйте данный скрипт в текстовый файл, например ping_check.sh.
  2. Сделайте файл исполняемым с помощью команды:
    chmod +x ping_check.sh
  3. Запустите скрипт:
    ./ping_check.sh

Заключение

Таким образом, вы получаете эффективный скрипт на Bash, который позволяет контролировать доступность хоста с заданными параметрами. Вы можете настроить его под свои нужды, изменив переменные HOST, EMAIL и другие параметры. Такой подход обеспечит автоматизацию мониторинга доступности и своевременное уведомление о любых проблемах.

Оцените материал
Добавить комментарий

Капча загружается...