Що таке crontab і як налаштувати завдання
Автор: Редакція Domeny.ForSale Опубліковано
Коротко: Crontab — це таблиця з розкладом команд, які автоматично запускає служба cron, найчастіше в системах Linux і Unix. Так само називається команда для керування цією таблицею. За допомогою crontab можна, наприклад, щодня створювати резервну копію або запускати скрипт кожні кілька хвилин, не входячи щоразу на сервер вручну.
Чим відрізняються cron і crontab?
Cron — це фонова служба, яка перевіряє розклад і запускає записані команди у визначений час. Crontab — це конфігурація цього розкладу. Самого запису недостатньо: служба cron має бути встановлена й запущена, а комп’ютер або сервер має працювати в запланований час.
Користувачі можуть мати власні таблиці crontab. Завдання виконується з правами власника відповідної таблиці, тому запис, доданий звичайним користувачем, не отримує автоматично прав адміністратора. Це важливо і для безпеки, і для доступу до файлів.
Cron добре підходить для регулярних технічних завдань: створення звітів, синхронізації даних чи видалення тимчасових файлів. Проте сам по собі він не реагує на події, наприклад оформлення замовлення, — команди запускаються за часом, указаним у конфігурації.
Як читати запис у crontab?
У таблиці crontab користувача кожен запис містить п’ять полів часу, після яких іде команда:
khvylyna hodyna den_misiatsia misiats den_tyzhnia komanda
Поля розділяються пробілами або символами табуляції. Їхнє основне значення наведено в таблиці:
| Поле | Типовий діапазон | Значення зірочки * |
|---|---|---|
| Хвилина | 0–59 | Кожна хвилина |
| Година | 0–23 | Кожна година |
| День місяця | 1–31 | Кожен день місяця |
| Місяць | 1–12 | Кожен місяць |
| День тижня | 0–7, зазвичай 0 і 7 означають неділю | Кожен день тижня |
Приклад запису:
30 2 * * * /home/hanna/bin/backup.sh
Він означає запуск скрипту backup.sh щодня о 02:30. Час визначається за часовим поясом, який використовує cron. Найчастіше це часовий пояс сервера, а не комп’ютера людини, яка редагує розклад.
Для запису часу запуску також корисні коми, діапазони та кроки:
0 8 * * 1-5— о 08:00 з понеділка до п’ятниці.0 9,17 * * *— щодня о 09:00 і 17:00.*/15 * * * *— на 0-й, 15-й, 30-й і 45-й хвилині кожної години.
Крок не означає інтервал, який відлічується від завершення завдання. Запис */15 запускає команду за годинником, навіть якщо попереднє виконання ще триває. А */7 у полі хвилин не забезпечує рівних семихвилинних інтервалів протягом усієї доби: після 56-ї хвилини наступний запуск відбудеться на 0-й хвилині наступної години.
Важлива особливість стосується полів дня місяця та дня тижня. У поширених реалізаціях cron, якщо в обох полях задано обмеження, достатньо виконання однієї з цих умов. Отже, запис 0 9 1 * 1 означає запуск о 09:00 першого дня місяця або в понеділок, а не лише в понеділок, який припадає на перше число місяця. Подробиці синтаксису можна перевірити в документації вашої реалізації, зазвичай за допомогою man 5 crontab.
Як додати й перевірити завдання?
Найбезпечніше почати з нешкідливого тесту, який записує дату у файл. Це дає змогу перевірити розклад незалежно від роботи основного скрипту.
- Відкрийте таблицю поточного користувача командою
crontab -e. - Додайте наведений нижче запис, змінивши шляхи відповідно до вашої системи.
- Збережіть файл і закрийте редактор.
- Через одну–дві хвилини перевірте файл із результатом.
* * * * * /usr/bin/date >> /home/hanna/cron-test.log 2>&1
Оператор >> дописує результат у файл, а не перезаписує його. Запис 2>&1 спрямовує повідомлення про помилки в те саме місце. Цільовий каталог має існувати, а користувач повинен мати право запису.
Команда crontab -l показує збережені завдання. Після успішного тесту видаліть тестовий рядок за допомогою crontab -e і додайте потрібний розклад. Будьте обережні з crontab -r: ця команда видаляє всю таблицю користувача, а не окремий запис.
Не плутайте таблицю користувача із системним файлом /etc/crontab. У цьому файлі, а також у типових файлах у /etc/cron.d/ між полями часу та командою є додаткове поле з іменем користувача, від якого виконується завдання.
Чому скрипт працює вручну, але не через cron?
Cron запускає команди в іншому, зазвичай більш обмеженому середовищі, ніж термінал користувача. Не варто припускати, що він завантажить конфігурацію оболонки, матиме ті самі змінні або почне роботу в каталозі скрипту.
Під час діагностики насамперед перевірте:
- Шляхи: використовуйте повні шляхи до програм і файлів; якщо скрипту потрібен певний робочий каталог, задайте його явно.
- Права доступу: користувач, від якого виконується завдання, повинен мати змогу читати дані й записувати результат; скрипт, який запускається безпосередньо, потребує права на виконання та коректного рядка, що вказує інтерпретатор.
- Середовище: задайте потрібні змінні та відповідний інтерпретатор замість того, щоб покладатися на конфігурацію термінала.
- Журнали: записуйте результат і помилки завдання; також перевірте стан служби та журнали cron, передбачені у вашій системі.
Якщо завдання може тривати довше, ніж інтервал між запусками, застосуйте блокування, яке запобігає паралельному виконанню, наприклад за допомогою інструмента flock, якщо він доступний. Сам cron такого захисту не забезпечує.
Коли потрібно щось більше, ніж crontab?
Класичний cron зазвичай не виконує згодом завдання, пропущені, поки комп’ютер був вимкнений. Перехід на літній або зимовий час також може впливати на запуски в години переходу; точна поведінка залежить від реалізації. Для ноутбука або завдань, які потрібно виконувати навіть після пропуску запланованого часу, розгляньте anacron або відповідно налаштований таймер systemd.
Перш ніж додавати важливе завдання, запустіть його команду вручну від імені потрібного користувача, а потім перевірте виконання через cron із записом помилок. Для резервних копій також перевірте можливість відновлення даних: успішний запуск скрипту ще не доводить, що копія придатна для використання.
Дивіться також: Що таке 2FA?
