
Планировщик заданий Cron
06.05.2019 18:11 | Другое
Даже на каких-то малых проектах Вам скорее всего периодически придётся выполнять какие-то задания. Например, раз в сутки удалять пользователей не подтвердивших адрес электронной почты, раз в день или неделю делать рассылку новостей и т.д. Поэтому необходимо знать что такое 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
Успехов!