cron — це механізм Linux для автоматичного виконання команд і скриптів за розкладом. Він використовується для регулярних завдань: резервного копіювання, очищення тимчасових файлів, запуску скриптів, перевірки сервісів тощо.
Фоновий процес, який виконує заплановані завдання, називається cron daemon. У сучасних Linux-системах його часто реалізовано через cronie або сумісний cron-сервіс.
Crontab
Розклад завдань зберігається у crontab — таблиці cron-завдань.
Переглянути завдання поточного користувача:
crontab -l
Відредагувати їх:
crontab -e
Для редагування системного crontab потрібні права адміністратора:
sudo crontab -e
Важливо: crontab -e і sudo crontab -e працюють з різними таблицями. Перша належить поточному користувачу, друга — користувачу root.
Формат cron-запису
Звичайний запис crontab має п'ять полів часу та команду:
* * * * * команда
Поля означають:
* хвилина (0–59)
* година (0–23)
* день місяця (1–31)
* місяць (1–12)
* день тижня (0–7)
команда
Для дня тижня 0 і 7 зазвичай означають неділю.
Приклади розкладу
Виконувати команду кожну хвилину:
* * * * * /path/to/script.sh
Щогодини, на початку години:
0 * * * * /path/to/script.sh
Щодня о 02:30:
30 2 * * * /path/to/script.sh
Щопонеділка о 08:00:
0 8 * * 1 /path/to/script.sh
Першого числа кожного місяця о 03:00:
0 3 1 * * /path/to/script.sh
Спеціальні символи
У cron використовуються спеціальні оператори.
* означає «будь-яке значення».
* * * * * command
, дозволяє вказати кілька значень:
0 8,12,18 * * * command
Команда виконається о 08:00, 12:00 та 18:00.
- задає діапазон:
0 9 * * 1-5 command
Команда виконуватиметься о 09:00 з понеділка по п'ятницю.
/ задає інтервал:
*/10 * * * * command
Команда виконуватиметься кожні 10 хвилин.
Перенаправлення виводу
Якщо команда щось виводить у стандартний потік або завершується з помилкою, результат варто явно перенаправити.
0 2 * * * /path/to/script.sh >> /var/log/myscript.log 2>&1
Тут >> додає результат до файлу, а 2>&1 направляє повідомлення про помилки туди ж.
Якщо вивід взагалі не потрібен:
0 2 * * * /path/to/script.sh > /dev/null 2>&1
Команди в cron мають працювати інакше, ніж у терміналі
Одна з поширених помилок — припущення, що cron має те саме середовище, що й інтерактивний shell. Це не так. Зокрема, PATH та інші змінні середовища можуть відрізнятися.
Тому надійніше використовувати абсолютні шляхи:
0 2 * * * /usr/bin/python3 /home/user/script.py
Замість:
0 2 * * * python3 script.py
Також потрібно враховувати поточний робочий каталог. Не варто покладатися на відносні шляхи:
./backup.sh
Краще:
/home/user/scripts/backup.sh
Права доступу
Завдання cron виконується з правами користувача, якому належить crontab.
Наприклад, якщо додати завдання через:
crontab -e
воно виконуватиметься від імені поточного користувача.
Якщо використати:
sudo crontab -e
завдання виконуватиметься від імені root.
Не слід використовувати root без необхідності. Для звичайних операцій краще створювати cron-завдання від імені відповідного користувача.
Системний cron
Окрім crontab окремих користувачів, Linux має системні каталоги для періодичних завдань:
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
Також існує системний файл:
/etc/crontab
Він має додаткове поле — користувача:
* * * * * user command
Наприклад:
0 2 * * * root /usr/local/bin/backup.sh
У звичайному crontab -e користувач не вказується, оскільки він уже визначений самим crontab.
Перевірка роботи cron
Статус cron-сервісу в системах із systemd можна перевірити так:
systemctl status cron
На деяких дистрибутивах сервіс може називатися crond:
systemctl status crond
Журнал роботи можна переглядати через systemd journal:
journalctl -u cron
Але конкретне розташування та формат журналів залежать від дистрибутива та його конфігурації.
Коментарі
Дописати коментар