🏠 Домашнее задание — Занятие 27

К оглавлению урока

⚡ ДЗ кратко

Бесконечный ping-скрипт: while true; do ping -c 1 "$target" | grep 'icmp_seq'; если >100 мс или 3 подряд неудачи — сообщение; sleep 1. Прислать скрипт или ссылку на GitHub.

Задание (дословно из LMS)

Linux: Домашнее задание 17

Написать скрипт, который будет бесконечно пинговать указанный адрес (переменная или ввод пользователя) с интервалом 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-репозиторий.

Связь с теорией урока