Автоматическое выполнение задач с помощью cron.

Cron — широко используемый инструмент в операционных системах Unix для планирования выполнения различных задач. Он способен в обозначенное время с определенной периодичностью выполнять скрипты на сервере. Этот инструмент полезен для выполнения различных задач, таких как мониторинг свободного места на диске, выполнения регулярного резервного копирования, удаления ненужных файлов (логов) и прочего.

Коротко cron можно описать как планировщик задач. Например, разработчику нужно собирать статистику каждые 4 дня в 16:00. Для этого он создает «задание», логику которого описывает в файле crontab. Cron является встроенной утилитой и доступен в каждом дистрибутиве Linux.

Следующие файлы ограничивают доступ к планировщику (по умолчанию они не существуют):

  • /etc/cron.allow - если существует, пользователи указанные в этом файле имеют возможность запуска заданий планировщика;
  • /etc/cron.deny - если существует, пользователи указанные в этом файле не имеют возможность запуска заданий планировщика.

Если cron.allow существует, только юзерам, перечисленным в нем, разрешено использовать cron, при этом файл cron.deny игнорируется. Если cron.allow не существует, юзерам, указанным в cron.deny, не разрешается использовать планировщик cron.

Формат записей в обоих файлах - одно имя пользователя в каждой строке. Пробелы не разрешены. Файлы контроля доступа считываются каждый раз, когда пользователь пытается добавить или удалить задачу cron.

Каждая запись в crontab состоит из шести полей, указываемых в следующем порядке:

minute(s) hour(s) day(s) month(s) weekday(s) command(s)

Поля разделяются пробелами или знаками табуляции. Первые пять представляют собой числовые значения, а шестое - это команда, которая будет выполняться. В следующей таблице кратко описывается каждое из полей:

Стандартная запись будет выглядеть так:

20 07 * * * /home/admin/backup

Запуск скрипта каждый понедельник в 9:00 и 18:00 часов:

 0 9,18 * * 1 /home/ivan/script.sh 

Запуск команды каждый месяц 1 числа в 12:00:

0 12 1 * * command

Запуск скрипта в полночь с понедельника по пятницу:

0 0 * * 1-5 /home/ivan/script.sh

Запуск скрипта каждый день в 0:30 и 12:30:

30 */12 * * * script.sh

Существуют уже готовые команды, которые позволяют задать параметры выполнения скрипта. Они выглядят так:

  • @reboot — команда выполнится один раз при перезагрузке системы;
  • @yearly — задание будет выполняться один раз в год;
  • @annually — вариация команды @yearly, делает то же самое, но в Новый год;
  • @monthly — ежемесячное выполнение задания;
  • @weekly — скрипт будет срабатывать раз в неделю;
  • @daily — ежедневное выполнение;
  • @midnight — срабатывание раз в день в полночь;
  • @hourly — скрипт выполняется ежечасно.

Записи с готовыми командами выглядят следующим образом:

@monthly <исполняемая-команда>

Обратите внимание, Cron считается устаревшим в операционных системах с поддержкой systemd. В таких дистрибутивах Linux его заменили на systemd.timer. Предназначение этой утилиты полностью совпадает с cron. При этом популярность «устаревшего» планировщика все еще выше благодаря простоте использования.