Задание (дословно из LMS)
Linux: Домашнее задание 17
Написать скрипт, который будет бесконечно пинговать указанный адрес (переменная или ввод пользователя) с интервалом 1 секунда между попытками. Если время пинга превышает 100 мс или не удается выполнить пинг в течение 3 последовательных отправок пакетов, скрипт просто выведет сообщения об этом.
Пришлите скрипт или ссылку на github репо с решением.
Написать скрипт, который будет бесконечно пинговать указанный адрес (переменная или ввод пользователя) с интервалом 1 секунда между попытками. Если время пинга превышает 100 мс или не удается выполнить пинг в течение 3 последовательных отправок пакетов, скрипт просто выведет сообщения об этом.
Пришлите скрипт или ссылку на github репо с решением.
Подготовка окружения
1. Создать файл скрипта
# На сервере linux.itcareerhub.de или в JSLinux
touch infinite_ping.sh
chmod +x infinite_ping.sh
nano infinite_ping.sh # или vi infinite_ping.sh
2. Структура решения
Скрипт должен:
- Запросить или задать адрес через переменную
- Запустить бесконечный цикл
while true - Внутри цикла: выполнить один ping (
ping -c 1), получить результат - Проверить время пинга (если >100 мс — вывести предупреждение)
- Считать последовательные неудачи (если 3 подряд — вывести предупреждение)
- Ждать 1 секунду перед следующей попыткой
3. Остановить скрипт
# Ctrl+C прерывает выполнение
# Или из другого терминала:
kill $(pgrep -f infinite_ping.sh)
Пошаговое решение
Шаг 1. Минимальная рабочая версия
# infinite_ping.sh — минимальная версия
#!/bin/bash
target_address="8.8.8.8" # или read -p "Адрес: " target_address
while true; do
ping -c 1 "$target_address" | grep 'icmp_seq'
sleep 1
done
Шаг 2. Проверка времени пинга (>100 мс)
# infinite_ping.sh — с проверкой времени
#!/bin/bash
read -p "Введите адрес для мониторинга: " target_address
failures=0
while true; do
ping_result=$(ping -c 1 "$target_address" | grep 'icmp_seq')
if [ -z "$ping_result" ]; then
failures=$((failures + 1))
echo "ПРЕДУПРЕЖДЕНИЕ: ping не удался (попытка $failures)"
if [ $failures -ge 3 ]; then
echo "КРИТИЧНО: $failures подряд неудачных ping до $target_address!"
fi
else
failures=0
# Извлечь время из строки: time=5.678 ms
ping_time=$(echo "$ping_result" | awk -F'time=' '{print $2}' | awk '{print $1}')
echo "OK: $target_address — ${ping_time} мс"
# Сравнить: если время > 100 мс
if [ -n "$ping_time" ]; then
# Сравниваем через awk (поддерживает дробные числа)
check=$(echo "$ping_time 100" | awk '{if ($1 > $2) print "HIGH"; else print "OK"}')
if [ "$check" = "HIGH" ]; then
echo "ПРЕДУПРЕЖДЕНИЕ: высокое время пинга — ${ping_time} мс (> 100 мс)"
fi
fi
fi
sleep 1
done
Шаг 3. Проверка в терминале
# Запуск
bash infinite_ping.sh
# Ожидаемый вывод:
# OK: 8.8.8.8 — 5.678 мс
# OK: 8.8.8.8 — 4.123 мс
# ПРЕДУПРЕЖДЕНИЕ: ping не удался (попытка 1)
# ПРЕДУПРЕЖДЕНИЕ: ping не удался (попытка 2)
# КРИТИЧНО: 3 подряд неудачных ping до 8.8.8.8!
# Остановить — Ctrl+C
Загрузка на GitHub
# Инициализировать репозиторий (если нет)
cd ~/scripts
git init
git add infinite_ping.sh
git commit -m "Add infinite ping monitoring script"
git remote add origin https://github.com/YOUR_USERNAME/linux-scripts.git
git push -u origin main
Прислать: скрипт в виде файла или ссылку на GitHub-репозиторий.
Связь с теорией урока
- Задача 2 (pinger.sh) — тот же принцип ping + awk, но конечный
- Пример: while true — управление бесконечным циклом и Ctrl+C
- Справочник: ping, read — использованные команды