Вопрос или проблема
Добрый вечер
Мне нужен скрипт на 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 минут и отправлять уведомление по электронной почте в случае полной потери пакетов.
Структура скрипта
- Определение хоста и переменных.
- Функция для выполнения ping и проверки результатов.
- Цикл для повторных попыток с ожиданием.
- Отправка уведомления по электронной почте.
Пример скрипта
#!/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
Пояснение
-
Определение переменных:
HOST
– IP-адрес или имя хоста, который вы хотите проверить.EMAIL
– адрес электронной почты, на который будет отправлено уведомление.PING_COUNT
– количество отправленных пакетов в одном запросе.DELAY
– время в секундах, в течение которого скрипт будет ждать между попытками.
-
Функция
ping_test
:- Выполняет команду
ping
и перенаправляет вывод в/dev/null
, чтобы избежать ненужной информации на экране. - Возвращает код завершения, который указывает на успешность операции.
- Выполняет команду
-
Цикл
for
:- Выполняет проверку доступности в три этапа. Если пинг успешен, скрипт выводит сообщение об этом и завершает свою работу.
- Если пинг неуспешен, скрипт ждет 10 минут перед следующей попыткой.
-
Отправка уведомления по электронной почте:
- Если все три попытки не увенчались успехом, скрипт отправляет уведомление о недоступности хоста на указанный адрес электронной почты.
Установка и запуск скрипта
- Скопируйте данный скрипт в текстовый файл, например
ping_check.sh
. - Сделайте файл исполняемым с помощью команды:
chmod +x ping_check.sh
- Запустите скрипт:
./ping_check.sh
Заключение
Таким образом, вы получаете эффективный скрипт на Bash, который позволяет контролировать доступность хоста с заданными параметрами. Вы можете настроить его под свои нужды, изменив переменные HOST
, EMAIL
и другие параметры. Такой подход обеспечит автоматизацию мониторинга доступности и своевременное уведомление о любых проблемах.