💻 Разбор домашних заданий

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

⚡ Краткий итог

ДЗ 27: ping-мониторинг с while true. ДЗ 28: укрупнение репозиториев (monorepo). Типичные ошибки: ping_time неопределена при ошибке; счётчик failures не сбрасывается при успехе.

Разбор ДЗ 27: ping-скрипт (бесконечный мониторинг)

Задание: Написать скрипт, который бесконечно пингует указанный адрес (1 сек между попытками). Если время пинга превышает 100 мс или 3 подряд неудачи — вывести сообщение.

Эталонное решение (из источника)

#!/bin/bash
target_address="google.com"
max_ping_time_ms=10
max_failures=3
failures=0

while true; do
  ping_result=$(ping -c 1 "$target_address" | grep 'icmp_seq')
  ping_time=$(echo "$ping_result" | awk -F'=' '{print $4}' | awk '{print $1}' | awk -F'.' '{print $1}')

  if [ -n "$ping_time" ] && [ "$ping_time" -gt "$max_ping_time_ms" ]; then
    echo "Пинг $target_address превышает $max_ping_time_ms мс: $ping_time мс."
  fi

  if [ -z "$ping_time" ]; then
    echo "Пинг $target_address не удался."
    ((failures++))
  else
    echo "Пинг $target_address успешен: $ping_time мс."
    failures=0
  fi

  if [ "$failures" -ge "$max_failures" ]; then
    echo "Превышено максимальное количество неудачных попыток."
    failures=0
  fi

  sleep 1
done

Разбор ключевых моментов

  • ping -c 1 "$target_address" | grep 'icmp_seq' — выполнить один пинг и отфильтровать строку с результатом
  • awk -F'=' '{print $4}' — разделить вывод по = и взять четвёртое поле (время)
  • awk -F'.' '{print $1}' — взять целую часть числа (миллисекунды без дробной части)
  • [ -z "$ping_time" ] — проверяет, пустая ли строка (-z = zero length)
  • [ -n "$ping_time" ] — проверяет, непустая ли строка (-n = non-empty)
  • ((failures++)) — арифметический инкремент в bash
  • failures=0 — сброс счётчика при успехе
Как остановить бесконечный цикл: нажать Ctrl+C в терминале — это посылает сигнал SIGINT процессу и завершает его.

Разбор ДЗ 28: укрупнение репозиториев (monorepo)

Задание: Провести «укрупнение» своих репозиториев — вместо множества разрозненных (Lesson1..Lesson10) создать репозитории по темам или один для всего обучения. Прислать ссылку.

Типовой процесс миграции

# Шаг 1: создать новый monorepo
mkdir my-linux-git-course
cd my-linux-git-course
git init

# Шаг 2: скопировать содержимое старых репозиториев в поддиректории
mkdir lesson01 lesson02 lesson03
# скопировать файлы из репозиториев в директории

# Шаг 3: если нужно избавиться от вложенных .git
# (перед этим убедитесь, что история не нужна!)
find . -type d -name ".git" -exec rm -rf {} +

# Шаг 4: добавить и закоммитить всё
git add .
git commit -m "Initial monorepo: merge Lesson01-10"

# Шаг 5: запушить на GitHub
git remote add origin https://github.com/user/my-linux-git-course.git
git push -u origin main
Важно: команда find . -type d -name ".git" -exec rm -rf {} + безвозвратно удаляет всю историю коммитов во вложенных репозиториях. Выполняйте только если история не нужна и у вас есть резервная копия.

Типичные ошибки при миграции

  • Забыть про git remote add origin перед пушем
  • Попытаться сделать git push без -u origin main (новый репозиторий)
  • Потерять историю — нет резервной копии старых репозиториев