Планировщик заданий Cron

Планировщик заданий Cron

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

Общее описание

Cron - это планировщик, который позволяет пользователям автоматически выполнять задачи по расписанию. Каждая задача описывается в файле crontab в одной строке, в которой указывается, когда она должна быть запущена и какая команда должна быть выполнена. Строка задания представляет собой 6 полей - первых 5 отвечают за время, а последняя - скрипт:

* * * * * /path/to/task.sh

 

или схематически:

[минуты] [часы] [день месяца] [месяц] [день недели] [абсолютный путь к файлу]

Символ * обозначает все возможные значения, т.е. в примере выше скрипт task.sh будет выполнятся каждую минуту каждого часа каждого дня месяца и т.д. Можно указывать как отдельное значение, так и диапазон, например 0-10 или 15-20. Допустимы и несколько диапазонов, перечисленных через запятую: jan-mar,nov-dec.

Полезные команды

Посмотреть список задач текущего пользователя:

crontab -l

 

Вывести список задач конкретного пользователя:

crontab -u <username> -l

 

Резервное копирование задач в текстовый файл:

crontab -l > backup.txt

 

Восстановление задач из файла-бэкапа:

crontab backup.txt

 

Удаление текущих задач:

crontab -r

 

Как добавить или отредактировать crontab-файл

Выполните команду:

crontab -e

 

При этом откроется crotnab-файл в редакторе по умолчанию (обычно это vi/vim, но например я изменил его на nano). Добавить в файл задания. При этом следует убедиться, что файлы скриптов имеют права на чтение и выполнение.

Примеры

Выполнять задачу каждую минуту:

* * * * * /task.sh

 

Выполнять задачу каждый день в 8 утра:

0 8 * * * /task.sh

 

Выполнять задачу каждый день в 8 утра и 8 вечера:

0 8,20 * * * /task.sh

 

Выполнять задачу каждые полчаса:

*/30 * * * * /task.sh

 

Выполнять задачу каждые 2 часа:

0 */2 * * * /task.sh

 

Выполнять задачу в 7 утра по понедельникам:

0 7 * * mon /task.sh

 

Выполнять задачу каждый час (идентично 0 * * * *):

@hourly /task.sh

 

Также возможны следующие варианты:

  • ежедневно: @daily (то же самое что и 0 0 * * *)
  • еженедельно: @weekly (то же самое что и 0 0 * * mon
  • ежемесячно: @monthly (то же самое что и 0 0 1 * *)
  • ежегодно: @yearly (то же самое что и 0 0 1 1 *

Есть также полезная команда, которая будет выполняться при (ре)старте системы, и может понадобиться для автоматического запуска каких-либо задач в фоновом режиме:

@reboot /task.sh

 

Успехов!