💻 Разбор домашних заданий
⚡ Краткий итог
ДЗ 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++))— арифметический инкремент в bashfailures=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(новый репозиторий) - Потерять историю — нет резервной копии старых репозиториев