1. Постановка задачи
Сегодня мы напишем реальный скрипт, который проверяет доступность сайта и записывает результат в лог-файл, а затем автоматизируем его запуск с помощью cron.
Что мы хотим сделать?
Мы будем создавать bash-скрипт, который:
- Проверяет доступность указанного сайта с помощью
ping. - Записывает результат проверки в файл журнала, включая время и дату.
- Запускать этот скрипт автоматически каждые 5 минут с помощью
cron.
Почему это важно?
В реальном мире мониторинг доступности веб-сайтов и серверов — одна из ключевых задач системных администраторов. Например, если ваш сайт (или сервер) внезапно перестал отвечать, вы хотите узнать об этом как можно раньше. Такой сценарий полезен не только для мониторинга, но и на собеседованиях или в рабочей практике.
2. Шаг 1: Написание простого bash-скрипта
Начнём с написания основного bash-скрипта. Вот пошаговое объяснение того, что он будет делать:
- Мы зададим адрес сайта, который нужно проверять.
- Используем
pingдля попытки отправки запроса серверу. - Проверим, вернулся ли доступный ответ.
- Сохраним результат в лог-файл.
Давайте создадим файл site_check.sh:
#!/bin/bash
# Определяем адрес вебсайта
WEBSITE="example.com"
# Файл для логирования результатов
LOG_FILE="/var/log/site_status.log"
# Проверяем доступность сайта с помощью ping
if ping -c 1 $WEBSITE &> /dev/null; then
# Если сайт доступен
echo "$(date): $WEBSITE is reachable" >> $LOG_FILE
else
# Если сайт недоступен
echo "$(date): $WEBSITE is unreachable" >> $LOG_FILE
fi
Объяснение кода:
#!/bin/bash— указывает, что этот скрипт должен выполняться с использованием Bash.WEBSITE="example.com"— адрес сайта, который нужно проверять. Вы можете заменитьexample.comна любой сайт или сервер, который хотите мониторить.ping -c 1 $WEBSITE— отправляет один (-c 1) пакет на указанный сайт. Если сайт отвечает, команда завершается с кодом 0. Если нет — с ошибкой.&> /dev/null— перенаправляет стандартный вывод и ошибки в "чёрную дыру" (мы не хотим видеть выводpingв консоли).$(date)— добавляет текущую дату и время в сообщение.>> $LOG_FILE— дописывает результат в конец файла логов.
3. Шаг 2: Запуск скрипта вручную
Прежде чем автоматизировать выполнение скрипта, давайте убедимся, что он работает.
Сохраните скрипт в файл
site_check.sh.Сделайте его исполняемым:
chmod +x site_check.shЗапустите:
sudo ./site_check.sh
После выполнения скрипта откройте файл /var/log/site_status.log, чтобы убедиться, что результат проверки добавлен в лог. Используйте команду:
cat /var/log/site_status.log
Если всё работает, вы должны увидеть строку вроде:
Mon Oct 30 14:35:22 UTC 2023: example.com is reachable
4. Шаг 3: Настройка автоматического выполнения с помощью cron
Мы уже знаем, что cron позволяет запускать задачи по расписанию. Теперь мы настроим cron, чтобы наш скрипт запускался каждые 5 минут.
Редактирование crontab
Откройте редактор crontab:
crontab -e
Добавьте следующую строку:
*/5 * * * * /path/to/site_check.sh
Объяснение:
*/5— указывает, что задача должна запускаться каждые 5 минут./path/to/site_check.sh— полный путь до нашего скрипта. Убедитесь, что он правильный. Например, если скрипт находится в домашней директории пользователя, путь будет что-то вроде/home/your_username/site_check.sh.
После сохранения изменений cron начнёт запускать скрипт каждые 5 минут. Чтобы убедиться, что задача добавлена, выполните:
crontab -l
5. Шаг 4: Проверка работы cron
Теперь проверим, работает ли автоматизация. Подождите 5-10 минут и снова откройте файл логов:
cat /var/log/site_status.log
Вы должны увидеть новые записи, которые обновляются каждые 5 минут. Например:
Mon Oct 30 14:35:22 UTC 2023: example.com is reachable
Mon Oct 30 14:40:22 UTC 2023: example.com is reachable
Mon Oct 30 14:45:22 UTC 2023: example.com is reachable
6. Разбор типичных вопросов и ошибок
Пинг возвращает ошибку 'Permission denied'
Если вы запускаете скрипт от имени обычного пользователя, возможно, у него недостаточно прав. Выполните скрипт с
sudoили добавьте права на выполнение.Файл логов не создаётся
Убедитесь, что путь к файлу логов (
/var/log/site_status.log) указан правильно и у вашего пользователя есть права на запись в эту директорию. Если файла нет, создайте его вручную с помощью:sudo touch /var/log/site_status.log sudo chmod 666 /var/log/site_status.logcronне запускает скриптПроверьте, работает ли служба
cron:sudo systemctl status cronОна должна быть в статусе
active (running). Если она остановлена, запустите её:sudo systemctl start cronСкрипт не выполняется cron, но вручную работает
Убедитесь, что путь к скрипту и всем используемым файлам прописан полностью. В
cron-задачах переменные окружения (например,$PATH) могут быть другими. Лучше использовать абсолютные пути.
7. Улучшения и дополнительные задания
Фильтрация вебсайтов
Расширьте скрипт так, чтобы он проверял доступность нескольких сайтов. Например:
WEBSITES=("example.com" "google.com" "stackoverflow.com")
for SITE in ${WEBSITES[@]}; do
if ping -c 1 $SITE &> /dev/null; then
echo "$(date): $SITE is reachable" >> $LOG_FILE
else
echo "$(date): $SITE is unreachable" >> $LOG_FILE
fi
done
Отправка уведомлений
Добавьте отправку уведомлений, если сайт недоступен. Например, используя команду mail для отправки email:
# Уведомление по email
if ! ping -c 1 $WEBSITE &> /dev/null; then
echo "$WEBSITE is down!" | mail -s "Website Check Alert" your_email@example.com
fi
Цикличное логирование
Ограничьте размер лог-файла до, скажем, 1 МБ. Если файл становится слишком большим, переименуйте его (как архив) и начните новый лог.
Поздравляю! Теперь вы знаете, как использовать bash-скрипты и cron для автоматизации реальных задач. Эти навыки особенно востребованы для DevOps-инженеров и системных администраторов.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ