JavaRush /Курсы /Docker SELF /Написание простого bash-скрипта для автоматизации задач с...

Написание простого bash-скрипта для автоматизации задач с использованием cron

Docker SELF
3 уровень , 6 лекция
Открыта

1. Постановка задачи

Сегодня мы напишем реальный скрипт, который проверяет доступность сайта и записывает результат в лог-файл, а затем автоматизируем его запуск с помощью cron.

Что мы хотим сделать?

Мы будем создавать bash-скрипт, который:

  1. Проверяет доступность указанного сайта с помощью ping.
  2. Записывает результат проверки в файл журнала, включая время и дату.
  3. Запускать этот скрипт автоматически каждые 5 минут с помощью cron.

Почему это важно?

В реальном мире мониторинг доступности веб-сайтов и серверов — одна из ключевых задач системных администраторов. Например, если ваш сайт (или сервер) внезапно перестал отвечать, вы хотите узнать об этом как можно раньше. Такой сценарий полезен не только для мониторинга, но и на собеседованиях или в рабочей практике.


2. Шаг 1: Написание простого bash-скрипта

Начнём с написания основного bash-скрипта. Вот пошаговое объяснение того, что он будет делать:

  1. Мы зададим адрес сайта, который нужно проверять.
  2. Используем ping для попытки отправки запроса серверу.
  3. Проверим, вернулся ли доступный ответ.
  4. Сохраним результат в лог-файл.

Давайте создадим файл 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

Объяснение кода:

  1. #!/bin/bash — указывает, что этот скрипт должен выполняться с использованием Bash.
  2. WEBSITE="example.com" — адрес сайта, который нужно проверять. Вы можете заменить example.com на любой сайт или сервер, который хотите мониторить.
  3. ping -c 1 $WEBSITE — отправляет один (-c 1) пакет на указанный сайт. Если сайт отвечает, команда завершается с кодом 0. Если нет — с ошибкой.
  4. &> /dev/null — перенаправляет стандартный вывод и ошибки в "чёрную дыру" (мы не хотим видеть вывод ping в консоли).
  5. $(date) — добавляет текущую дату и время в сообщение.
  6. >> $LOG_FILE — дописывает результат в конец файла логов.

3. Шаг 2: Запуск скрипта вручную

Прежде чем автоматизировать выполнение скрипта, давайте убедимся, что он работает.

  1. Сохраните скрипт в файл site_check.sh.

  2. Сделайте его исполняемым:

    chmod +x site_check.sh
    
  3. Запустите:

    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. Разбор типичных вопросов и ошибок

  1. Пинг возвращает ошибку 'Permission denied'

    Если вы запускаете скрипт от имени обычного пользователя, возможно, у него недостаточно прав. Выполните скрипт с sudo или добавьте права на выполнение.

  2. Файл логов не создаётся

    Убедитесь, что путь к файлу логов (/var/log/site_status.log) указан правильно и у вашего пользователя есть права на запись в эту директорию. Если файла нет, создайте его вручную с помощью:

    sudo touch /var/log/site_status.log
    sudo chmod 666 /var/log/site_status.log
    
  3. cron не запускает скрипт

    Проверьте, работает ли служба cron:

    sudo systemctl status cron
    

    Она должна быть в статусе active (running). Если она остановлена, запустите её:

    sudo systemctl start cron
    
  4. Скрипт не выполняется 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-инженеров и системных администраторов.

1
Задача
Docker SELF, 3 уровень, 6 лекция
Недоступна
Создание простого bash-скрипта
Создание простого bash-скрипта
1
Задача
Docker SELF, 3 уровень, 6 лекция
Недоступна
Логирование результатов проверки
Логирование результатов проверки
1
Задача
Docker SELF, 3 уровень, 6 лекция
Недоступна
Автоматическая проверка каждые 5 минут
Автоматическая проверка каждые 5 минут
1
Задача
Docker SELF, 3 уровень, 6 лекция
Недоступна
Проверка нескольких сайтов
Проверка нескольких сайтов
1
Опрос
Сервисы Linux, 3 уровень, 6 лекция
Недоступен
Сервисы Linux
Сервисы Linux
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 64
24 сентября 2025
Вторая задача: Конченое описание условия - нам дают какую-то простыню с вписанным кодом и последней пустой строкой: "# Проверяем результат выполнения команды ping" Ну и хули вам надо? Можно как-то понятнее озвучивать условия заданий? Нафига в условиях писать то - что вы уже САМИ ВПИСАЛИ в решение? Четвертая задача: "Настройте crontab на вызов скрипта каждые 5 минут: " В самом окне уже вписано НЕПРАВИЛЬНОЕ решение. Зачем так делать?
Ilya Klimchev Уровень 1
15 сентября 2025
Если создавать файл логов в ручную через sudo, то он будет принадлежать root. chmod в этом случае будет выдавать гранты ВСЕМ пользователям. Имхо, chown на владельца cron-task выглядит релевантнее
Константин Contact Уровень 20
11 марта 2025
В 1-й задаче, даже если выбираешь "Правильное решение", валидатор не принимает. Как её решить-то? 😵
16 марта 2025
У меня принял, но самостоятельно не смог правильно решить
Slevin Уровень 64
24 сентября 2025
Приняло решение простым вписыванием одной строчки:

# Выполнение команды ping с минимальным количеством запросов (-c 1)
ping -c 1 $WEBSITE &> /dev/null