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 доступний" >> $LOG_FILE
else
# Якщо сайт недоступний
echo "$(date): $WEBSITE недоступний" >> $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. Розбір типових питань та помилок
Ping повертає помилку '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-інженерів і системних адміністраторів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ