Що таке crontab і як налаштувати завдання

Автор: Опубліковано

Коротко: 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. Найчастіше це часовий пояс сервера, а не комп’ютера людини, яка редагує розклад.

Для запису часу запуску також корисні коми, діапазони та кроки:

Крок не означає інтервал, який відлічується від завершення завдання. Запис */15 запускає команду за годинником, навіть якщо попереднє виконання ще триває. А */7 у полі хвилин не забезпечує рівних семихвилинних інтервалів протягом усієї доби: після 56-ї хвилини наступний запуск відбудеться на 0-й хвилині наступної години.

Важлива особливість стосується полів дня місяця та дня тижня. У поширених реалізаціях cron, якщо в обох полях задано обмеження, достатньо виконання однієї з цих умов. Отже, запис 0 9 1 * 1 означає запуск о 09:00 першого дня місяця або в понеділок, а не лише в понеділок, який припадає на перше число місяця. Подробиці синтаксису можна перевірити в документації вашої реалізації, зазвичай за допомогою man 5 crontab.

Як додати й перевірити завдання?

Найбезпечніше почати з нешкідливого тесту, який записує дату у файл. Це дає змогу перевірити розклад незалежно від роботи основного скрипту.

  1. Відкрийте таблицю поточного користувача командою crontab -e.
  2. Додайте наведений нижче запис, змінивши шляхи відповідно до вашої системи.
  3. Збережіть файл і закрийте редактор.
  4. Через одну–дві хвилини перевірте файл із результатом.
* * * * * /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 запускає команди в іншому, зазвичай більш обмеженому середовищі, ніж термінал користувача. Не варто припускати, що він завантажить конфігурацію оболонки, матиме ті самі змінні або почне роботу в каталозі скрипту.

Під час діагностики насамперед перевірте:

Якщо завдання може тривати довше, ніж інтервал між запусками, застосуйте блокування, яке запобігає паралельному виконанню, наприклад за допомогою інструмента flock, якщо він доступний. Сам cron такого захисту не забезпечує.

Коли потрібно щось більше, ніж crontab?

Класичний cron зазвичай не виконує згодом завдання, пропущені, поки комп’ютер був вимкнений. Перехід на літній або зимовий час також може впливати на запуски в години переходу; точна поведінка залежить від реалізації. Для ноутбука або завдань, які потрібно виконувати навіть після пропуску запланованого часу, розгляньте anacron або відповідно налаштований таймер systemd.

Перш ніж додавати важливе завдання, запустіть його команду вручну від імені потрібного користувача, а потім перевірте виконання через cron із записом помилок. Для резервних копій також перевірте можливість відновлення даних: успішний запуск скрипту ще не доводить, що копія придатна для використання.

Дивіться також: Що таке 2FA?

Читайте також

Дізнайтеся, як PHP-FPM обробляє запити PHP, чим відрізняється від вебсервера та як налаштувати процеси під трафік і ресурси хостингу.
Дізнайтеся, як BIND обслуговує DNS, чим відрізняються його серверні ролі та коли варто розгортати його самостійно замість керованої послуги.
Дізнайтеся, що означають польський реєстр і номер REGON, чим вони відрізняються від NIP та KRS і як перевірити дані підприємства.