Планування завдань з cron
Вступ
Мета
- Запуск програм або скриптів у заданий час.
- Автоматизація управління запланованими завданнями.
Інструкція через вебінтерфейс
Налаштування cron-завдань через вебінтерфейс:
- Перейдіть до LuCI → System → Scheduled Tasks.
- Відредагуйте конфігурацію та натисніть Save.
Інструкція через командний рядок
Налаштування cron-завдань через CLI:
# Редагувати конфігурацію crontab -e # Показати поточну конфігурацію crontab -l # Застосувати зміни service cron restart
Це відкриє файл конфігурації /etc/crontabs/root
у редакторі vi.
Обов’язково додайте символ нового рядка в кінці файлу. Просто залиште порожній рядок в кінці.
Формат завдання
Кожен рядок — окреме завдання, що має формат:
* * * * * команда для виконання - - - - - | | | | | | | | | ----- День тижня (0 - 6) (неділя = 0) | | | ------- Місяць (1 - 12) | | --------- День (1 - 31) | ----------- Година (0 - 23) ------------- Хвилина (0 - 59)
Приклади формату часу:
хв 0–59 | год 0–23 | день 1–31 | місяць 1–12 | день тижня 0–6 | Опис |
---|---|---|---|---|---|
*/5 | * | * | * | * | Кожні 5 хвилин |
12 | */3 | * | * | * | Що 3 години на 12-й хвилині |
57 | 11 | 15 | 1,6,12 | * | О 11:57 15-го числа січня, червня та грудня |
25 | 6 | * | * | 1-5 | О 6:25 в будні дні (понеділок–пʼятниця) |
0 | 0 | 4,12,26 | * | * | Опівночі 4-го, 12-го і 26-го числа кожного місяця |
5,10 | 9,14 | 10 | * | 0,4 | О 9:05, 9:10, 14:05 та 14:10 щонеділі та щочетверга |
0 (нуль) означає неділю. Якщо вказати 7, BusyBox буде виконувати команду щодня.
Таблиця скорочень:
Скорочення | Еквівалент | Опис |
---|---|---|
@reboot | Один раз при старті | |
@yearly | 0 0 1 1 * | Щороку |
@annually | 0 0 1 1 * | Щороку |
@monthly | 0 0 1 * * | Щомісяця |
@weekly | 0 0 * * 0 | Щотижня |
@daily | 0 0 * * * | Щодня |
@midnight | 0 0 * * * | Щодня |
@hourly | 0 * * * * | Щогодини |
Ці скорочення не активовані за замовчуванням. Вони працюють лише якщо busybox скомпільовано з опцією `FEATURE_CROND_SPECIAL_TIMES`.
Виправлення помилок
Щоб переглянути лог-повідомлення:
logread -e cron
Не всі повідомлення потрапляють до логів. Щоб збільшити деталізацію, змініть параметр cronloglevel
.
Додатково
Посилання
Періодичне перезавантаження
Простий спосіб вирішення деяких важко виявлюваних проблем (витік памʼяті, зниження продуктивності тощо) — це періодичне перезавантаження роутера, наприклад, щонічне.
Однак усе не так просто, як здається, оскільки більшість роутерів не мають апаратного годинника реального часу (RTC). Це може призвести до нескінченного циклу перезавантажень.
Під час завантаження годинник встановлюється утилітою sysfixtime
на час останньої модифікації будь-якого файлу в каталозі `/etc`.
Найновішим файлом може бути, наприклад, файл статусу або конфігурації, який змінився за ~30 секунд до перезавантаження.
Отже, під час завантаження годинник “відмотується назад” на кілька секунд.
Потім запускається cron і знову бачить, що “час на перезавантаження” вже настав — і перезавантажує пристрій ще раз...
Наприкінці завантаження запускається ntpd, який може встановити правильний час — але пізніше, ніж cron встигне ініціювати ще одне перезавантаження.
Рішення: додати затримку та створити (touch
) файл у /etc
перед командою перезавантаження.
# Перезавантаження щодня о 4:30 # Уникаємо нескінченого циклу: чекаємо 70 секунд # і торкаємось файлу в /etc, щоб годинник піднявся вище 4:30 30 4 * * * sleep 70 && touch /etc/banner && reboot
На багатьох пристроях команда
shutdown
не вимикає живлення — лише зупиняє процесор. У таких випадках reboot
працює коректно.
Періодичне перезапускання мережі
Простий спосіб автоматично перезапускати мережу (LAN, WAN і Wi-Fi) кожні 10 хвилин:
*/10 * * * * service network restart
Будильник
Якщо у вас увімкнено літній час (DST), ви можете реалізувати функцію “розумного будильника”.
Коли в Центральній Європі починається DST, годинник переводиться з 02:00 CET на 03:00 CEST (остання неділя березня). За шість днів до цього можна налаштувати Wake-on-LAN, щоб прокинутися на 10 хвилин раніше (запізнення не спрацює — запізнитесь).
Коли DST завершується (остання неділя жовтня), годинник переводиться з 03:00 CEST на 02:00 CET.
# хв година день місяць день_тижня команда 59 05 * * 1 /usr/bin/wol -h 192.168.1.255 xx:xx:xx:xx:xx:xx # crontab має завершуватись порожнім рядком або коментарем
Збереження конфігурацій / знімків налаштувань
Щоб зберігати останні N конфігурацій у каталозі /root
, можна скористатись cron. Це дозволить вам повертатися до конфігурацій останніх N днів. Завдання можна розширити, щоб копіювати конфігурації на інший пристрій для швидкого відновлення.
# Створення резервної копії/знімку конфігурації щодня о 00:01. Зберігати останні 100 #01 00 * * * sysupgrade -b "/root/backup-${HOSTNAME}.tar.gz" # <-- лише одна копія 01 00 * * * find "/root" -type f -name "backup-*.tar.gz" | sort -r | awk 'NR > 100' | xargs rm -f; sysupgrade -b "/root/backup-${HOSTNAME}-$(date +\%Y-\%m-\%d-\%H-\%M-\%S).tar.gz"