Cron - популярный демон, планировщик заданий работащий в Unix системах. Название этой утилиты произошло от греческого слово 'хронос', что в переводе означает время. Он позволяет автоматически выполнять определенные действия, команды, скрипты на сервере с заданной переодичностью или в определенное время.
Этот инструмент может быть полезен для:
- Отложенной рассылки писем
- Создания бэкапов
- Создания сводок базы данных
- Парсинга данных со сторонних ресурсов и последующей актуализации базы данных
- Планирования длительных задач таких как кодирование видео
и тому подобное.
Все cron задачи, которые еще называют cron jobs, необходимо добавлять в файл crontab. Для взаимодействия с этим файлом используется команда crontab. Эта комманда имеет следующие опиции:
$ crontab -e
- редактирование файла задач.
$ crontab -l
- вывести список задач.
$ crontab -r
- удалить все задачи.
$ crontab -u <username> { -l | -r | -e }
- взаимодейтвие с файлом задач другого пользователя системы.
Запускать команду с этой опцией можно только с правами суперпользователя.
* * * * * команда
| | | | |
| | | | --- день недели (0 - 6) (воскресенье = 0 или 7)
| | | ----- месяц (1 - 12)
| | ------- день месяца (1 - 31)
| --------- час (0 - 23)
----------- минута (0 - 59)
-
Звездочка ( * )
Звездочка указывает, что выражение cron соответствует всем значениям поля. Например, с помощью звездочки в 4-м поле (месяц) указывается каждый месяц.
-
Слэш ( / )
Слэши описывают шаги. Например, 3-59 / 15 в 1-м поле (минуты) указывают на третью минуту часа и каждые 15 минут после этого. Форма «* / ...» эквивалентна форме «first-last / ...», то есть шаг по максимально возможному диапазону поля.
-
Запятая ( , )
Запятые используются для разделения элементов списка. Например, использование «MON, WED, FRI» в пятом поле (день недели) означает понедельники, среды и пятницы.
-
Дефис ( - )
Дефисы определяют диапазоны. Например, 2000-2010 годы указывается каждый год в период с 2000 по 2010 год, включительно.
Вместо первых пяти полей можно использовать любую из восьми специальных строк. Это не только сэкономит время, но и улучшит читаемость.
@reboot
- запускается только один раз при запуске.@yearly
- запускается раз в год, «0 0 1 1 *».@annually
- тоже самое, что и @yearly.@monthly
- запускается раз в месяц, «0 0 1 * *».@weekly
- выполняется раз в неделю, «0 0 * * 0».@daily
- выполняется один раз в день, «0 0 * * *».@midnight
- тоже самое, что и @daily.@hourly
- запускается один раз в час, «0 * * * *».
-
Не использовать @reboot так как эта специальная строка очень часто работает некорректно. Детальнее.
-
Некоторые реализации cron позволяют указывать года и секунды. Не следует оперировать этими уровнями так как cron далеко не лучший инструмент для этого.
-
Запускайте ваши сервера и cron процессы во временной зоне UTC. Почему?
-
Более сложные расписания можно реализовать комбинируя несколько выражений cron. Например, если вам нужно запускать скрипт каждые 90 минут, создайте одну запись crontab, которая запускает скрипт каждые 3 часа (0 * / 3 * * *), и вторую запись crontab, которая запускает скрипт каждые 3 часа со смещением (30 1/3 * * *).
-
Если колонка дня месяца или дня недели начинается с *, они образуют пересечение. В противном случае они образуют союз. * * 3 * 1 выполняется в 3-й день месяца и в понедельник (объединение), тогда как * * * / 2 * 1 выполняется в каждый второй день месяца, только если это также понедельник (пересечение).
-
Необходимо указывать абсолютный путь к скрипту cron задачи, а так же абсолютные пути в самом скрипте. В противном случае скрипт работать не будет или будет работать некорректно.
-
Бывает случаи, когда cron перестает работать или задача выполнятся с ошибкой, что важно отслеживать. Для этого есть сервис healthchecks.io, который отправляет на почту уведомление, если задача перестала выполнятся.
0 9-17 * * * command
- в 0 минут каждого часа с 9 до 17.
0 2 * * * command
- каждый день в 2am.
0 0 1 */3 * command
- раз в квартал.
*/3 2,4 * * * command
- каждые 3 минуты 2-го и 4-го часа.