Краткое введение в cron-задания
Кратко
Cron — это планировщик задач в UNIX-подобных системах. В статье объясняется, как читать и редактировать crontab, как работает синтаксис строк cron, какие есть шаблоны и переменные окружения, а также перечислены типичные ошибки и альтернативы. Подойдёт системным администраторам и разработчикам, которые хотят автоматизировать периодические задачи.
Версия и автор
Version 1.0
Author: Falko Timme
О чём эта статья
Эта статья кратко вводит в cron-задания: что такое cron, как выглядят строки в crontab, как создавать, удалять и импортировать задачи, какие есть специальные строки и переменные. Приведены примеры, рекомендации по отладке и список альтернатив для продвинутых сценариев.
Важно: я не даю гарантий, что всё сработает в вашей системе без адаптации. Проверяйте пути и права доступа.
1. crontab
Команда для создания/редактирования, просмотра и удаления cron-заданий — crontab. Если вызвать её с опцией -u, вы указываете имя пользователя, crontab которого хотите изменить. Без -u команда работает с crontab текущего пользователя (того, кто выполняет команду).
Примеры команд:
crontab -lвыводит список cron-заданий для пользователя, от которого вы вошли в систему:
server1:~# crontab -l
* * * * * /usr/local/ispconfig/server/server.sh > /dev/null 2>> /var/log/ispconfig/cron.log
30 00 * * * /usr/local/ispconfig/server/cron_daily.sh > /dev/null 2>> /var/log/ispconfig/cron.log
server1:~#crontab -u exampleuser -lпокажет все cron-задания пользователя exampleuser.
crontab -eпозволяет создать или изменить cron-задания текущего пользователя (редактор определяется переменной VISUAL/EDITOR или умолчанием).
crontab -u exampleuser -eредактирует crontab пользователя exampleuser.
crontab -rудаляет все cron-задания пользователя, от имени которого выполнена команда.
crontab -u exampleuser -rудаляет все cron-задания exampleuser.
Если вы подготовили текстовый файл с заданиями, его можно импортировать в crontab. Например, предположим, вы создали файл /tmp/my_cron_jobs.txt:
vi /tmp/my_cron_jobs.txt… со следующим содержимым:
| 30 00 * * * /path/to/script |
Создать crontab из этого файла можно так:
crontab /tmp/my_cron_jobs.txt(Или для exampleuser:
crontab -u exampleuser /tmp/my_cron_jobs.txt)
Обратите внимание: импорт файла перезапишет все текущие записи crontab того пользователя. Если у вас уже есть задания, лучше открыть crontab через -e и добавить новое задание вручную.
Для подробностей смотрите:
man crontab2. Синтаксис cron-задания
Строка cron состоит из шести полей:
field allowed values
----- --------------
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sun, or use names)Когда указываете день недели, и 0, и 7 считаются воскресеньем.
Поле может быть звездочкой (*), что означает «все значения» (from first to last).
Для полей month и day of week можно использовать имена — первые три буквы (регистр не имеет значения), например sun или SUN для Sunday, mar или MAR для March. В русскоязычной документации часто встречаются английские имена дней и месяцев, так как это синтаксис cron.
Рассмотрим примеры из предыдущего раздела:
- /usr/local/ispconfig/server/server.sh > /dev/null 2>> /var/log/ispconfig/cron.log
Это означает: выполнить /usr/local/ispconfig/server/server.sh каждую минуту. Вывод перенаправляется в /dev/null, а STDERR добавляется в лог.
30 00 * /usr/local/ispconfig/server/cron_daily.sh > /dev/null 2>> /var/log/ispconfig/cron.log
Это означает: выполнить /usr/local/ispconfig/server/cron_daily.sh один раз в день в 00:30.
Поле запуска по дате может задаваться двумя способами: день месяца и день недели. Если оба поля ограничены (т.е. не ), команда запустится, когда совпадёт либо день месяца, либо день недели. Пример: 30 4 1,15 5 запустит команду в 04:30 1-го и 15-го числа каждого месяца, а также каждую пятницу.
Вы можете использовать диапазоны и списки:
- 1,2,5,9 — перечисление: первый, второй, пятый и девятый (минуты/часы/дни…)
- 0-4,8-12 — диапазоны: 0 до 4 и 8 до 12
- */5 — каждое пятое значение (каждые 5 минут/часов и т.д.)
- 1-9/2 эквивалентно 1,3,5,7,9
Диапазоны или списки имён не разрешены (например, Mon-Wed с именами не валиден в большинстве реализаций).
Пример комбинированного задания:
1,7,25,47 */2 * * * commandозначает: выполнять command каждую вторую неделю или, точнее, каждые 2 часа в минуты 1, 7, 25 и 47.
Вместо пяти первых полей можно использовать одну из восьми специальных строк:
string meaning
------ -------
@reboot Run once, at startup.
@yearly Run once a year, "0 0 1 1 *".
@annually (same as @yearly)
@monthly Run once a month, "0 0 1 * *".
@weekly Run once a week, "0 0 * * 0".
@daily Run once a day, "0 0 * * *".
@midnight (same as @daily)
@hourly Run once an hour, "0 * * * *".Эти специальные ярлыки делают crontab короче и удобнее для шаблонных задач.
Вы также можете определить переменные в crontab (name=value) для управления окружением выполнения задач:
# use /bin/bash to run commands, instead of the default /bin/sh
SHELL=/bin/bash
# mail any output to exampleuser, no matter whose crontab this is
MAILTO=exampleuser
# set the PATH variable to make sure all commands in the crontab are found
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * my_commandВажно: если вы не зададите PATH в crontab, используйте полные пути к программам. Вместо rsync пишите /usr/bin/rsync. Узнать полный путь можно через which:
which rsyncserver1:~# which rsync
/usr/bin/rsync
server1:~#Для подробностей о формате смотрите:
man 5 crontabОтладка и лучшие практики
- Всегда используйте полные пути к файлам и программам. Cron запускается в ограниченном окружении.
- Перенаправляйте stdout и stderr в лог-файлы, если хотите сохранить вывод: >> /path/to/log 2>&1.
- Проверяйте переменные окружения: если команда работает в интерактивной оболочке, но не в cron, скорее всего PATH или другие переменные отличаются.
- Тестируйте задания вручную с теми же пользователем и переменными окружения, что и в crontab.
- Избегайте частых задач с таймером меньше 1 минуты — cron не гарантирует жесткую точность, и большие нагрузки могут «накопиться».
Когда cron не подходит (контрпримеры)
- Когда нужны миллисекундные задержки или высокоточная периодичность — используйте специализированные планировщики или системные таймеры реального времени.
- Для локально-зависимых сервисов с перезапуском и зависимостями лучше подходят systemd-timers и unit-файлы в systemd.
- Для распределённых задач с очередями и повторными попытками лучше использовать очередь задач (RabbitMQ, Celery, Kubernetes CronJob).
Альтернативные подходы
- systemd timers — интеграция с systemd, зависимость от unit’ов, удобные опции перезапуска и журналирования.
- at — одноразовые отложенные задания.
- Kubernetes CronJob — для контейнеризованных нагрузок в кластере.
- Планировщики задач на уровне приложения (например, Sidekiq/Resque для Ruby, Celery для Python) — для сложной логики повторов и распределенных задач.
Быстрая шпаргалка (cheat sheet)
- Каждая строка: min hour day month weekday command
- — любое значение
- */N — каждое N-е значение
- A,B,C — список значений
- X-Y — диапазон
- @reboot, @daily, @hourly, @monthly, @weekly, @yearly — специальные шаблоны
- Обязательно указывайте SHELL и PATH, если команды не находятся в стандартных местах
Примеры полезных выражений:
# каждую минуту
* * * * * /usr/bin/some-script
# каждый день в 02:30
30 2 * * * /usr/local/bin/backup.sh
# каждый час в 15 минут
15 * * * * /usr/local/bin/check.sh
# каждое воскресенье в 03:00
0 3 * * 0 /usr/local/bin/weekly-maintenance.sh
# при загрузке системы
@reboot /usr/local/bin/startup-task.shРоль-по-роль: контрольный список
Администратор:
- Проверить права на скрипт и на лог-файлы (владелец/chmod).
- Установить MAILTO для получения вывода или настроить логирование.
- Добавить PATH и SHELL в crontab.
- Тестировать задания вручную под пользователем.
Разработчик:
- Делать скрипты идемпотентными (безопасные повторные запуски).
- Логировать только полезную информацию.
- Обрабатывать ошибки и возвращать код выхода.
Критерии приёмки (как проверить, что задача корректна)
- Скрипт выполняется вручную без ошибок под тем же пользователем и окружением.
- Cron-запись присутствует в crontab (-l отображает строку).
- Логи показывают ожидаемый вывод или отсутствие ошибок.
- При необходимости — письма на адрес MAILTO или централизованное логирование получили запись.
Малые методики: как добавить новую задачу безопасно
- Вручную протестируйте команду в шелле под нужным пользователем.
- Добавьте запись в crontab через crontab -e или создайте временный файл и crontab /tmp/file.
- Убедитесь, что PATH/SHELL установлены, и добавьте перенаправление вывода в лог.
- Наблюдайте за выполнением в первые 1–2 раза и проверяйте логи.
- При проблемах временно измените расписание на частое выполнение для ускоренной отладки.
Краткий словарь (1 строка определения)
- cron: системный демон, запускающий задачи по расписанию.
- crontab: таблица (файл) с заданиями для cron; также команда для управления этой таблицей.
- SHELL/PATH: переменные окружения, влияющие на исполнение команд в crontab.
- @reboot/@daily и т. п.: специальные шаблоны для часто используемых расписаний.
Безопасность и приватность
- Скрипты, запускаемые из cron, выполняются с привилегиями пользователя, чьим является crontab. Проверяйте права доступа и нежелательные включения конфиденциальных данных в лог.
- Не храните пароли в открытом виде в crontab; используйте защищённые хранилища или переменные окружения с ограниченным доступом.
Итог
Cron — простой и надёжный инструмент для регулярных задач. Главное — правильно указать пути, окружение и логирование. Для сложных или распределённых сценариев рассмотрите альтернативы (systemd-timers, Kubernetes CronJob, очереди задач).
Ресурсы для дальнейшего чтения
man crontab
man 5 crontabКраткие выводы
- Используйте полные пути и задавайте PATH в crontab.
- Логируйте stdout/stderr и проверяйте журналы при отладке.
- Для сложных сценариев выбирайте systemd-timers или специализированные планировщики.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента