cron
Cron — это планировщик задач, используемый для выполнения задач (в фоновом режиме) в указанное время.
Crontab — команда, которая используется, для управления планировщиком Cron. Команда crontab создает файл crontab, содержащий команды и инструкции для запуска демона cron
Установка cron
sudo apt update sudo apt install cron sudo systemctl enable cron
Задачи в cron записываются и управляются в специальном файле crontab. Каждый профиль пользователя в системе может иметь собственный файл crontab, где составляются расписания задач, которые хранятся в /var/spool/cron/crontabs/.
- /etc/cron.allow - если существует, пользователи указанные в этом файле имеют возможность запуска заданий планировщика;
- /etc/cron.deny - если существует, пользователи указанные в этом файле НЕ имеют возможность запуска заданий планировщика.
Если cron.allow существует, только пользователям, перечисленным в нем, разрешено использовать cron, при этом файл cron.deny игнорируется. Если cron.allow не существует, юзерам, указанным в cron.deny, не разрешается использовать планировщик cron.
Параметры команды Crontab
Команда | Описание |
---|---|
crontab -e | Редактирование или создание файла расписания для текущего пользователя |
crontab -l | Вывод содержимого расписания текущего пользователя |
crontab -r | Удаление файла расписания текущего пользователя |
crontab -u user | Работа с расписаниями конкретных пользователей. Доступно только суперпользователю |
Формат файла crontab
Поля разделяются пробелами или знаками табуляции. Первые пять представляют собой числовые значения, а шестое - это команда, которая будет выполняться. В следующей таблице кратко описывается каждое из полей:
Поле | Диапазон значений | |
---|---|---|
minute | 0-59 | Минута запуска команды |
hour | 0-23 | Час запуска |
day | 1-31 | Число (день) запуска |
month | 1-12 | Месяц запуска |
weekday | 0 - 6 | День недели запуска (воскресенье = 0, понедельник = 1, вторник = 2 и т.д.) |
command | Последовательность команд для выполнения. Это могут быть команды, исполняемые файлы (например, скрипты) или комбинации файлов. |
Значение первых пяти полей может быть либо * (звездочкой), что означает все допустимые значения, либо списком элементов, разделенных запятыми. Элемент является либо числовым, либо диапазоном чисел, обозначенным двумя значениями, разделенными тире (например, 10-12).
Специальные символы
Символ | Описание |
---|---|
* | в выражениях cron звездочка (*) служит подстановочным символом, который представляет все значения. Таким образом, задача, запланированная в форме * * * * * …, будет запускаться каждую минуту, каждый час, каждый день каждого месяца. |
, | запятые разбивают значения расписания для получения списка. Если вы хотите запускать задачу в начале и середине каждого часа, а не выполнять две отдельные задачи (например, 0 * * * * … и 30 * * * * …), вы можете добиться той же функциональности с помощью одного выражения (0,30 * * * * …) |
- | дефис представляет диапазон значений в поле расписания. Вместо создания 30 отдельных запланированных задач для команды, которую вы хотите запускать первые 30 минут каждого часа (например, 0 * * * * …, 1 * * * * …, 2 * * * * … и т. д.), вы можете просто запланировать его следующим образом: 0-29 * * * * …. |
/ | вы можете использовать косую черту со звездочкой для выражения значения шага. Например, вместо написания восьми отдельных задач cron для запуска команды каждые три часа (например, 0 0 * * * …, 0 3 * * * …, 0 6 * * * … и т. д.), вы можете задать расписание для запуска следующим образом: 0 */3 * * * …. |
@hourly | 0 * * * * |
@midnight | В полночь (00:00) |
@daily | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
@yearly или @annually | 0 0 1 1 * |
@reboot echo "System start up" | Запуск после перезагрузки |
Например, вы можете добавить следующие строки в файл crontab. К ним относятся оператор MAILTO, за которым следует пример адреса электронной почты, директива SHELL, которая указывает оболочку для запуска (в данном примере bash), директива HOME, указывающая путь поиска бинарного файла cron, и единственная задача cron:
. . . MAILTO="example@digitalocean.com" SHELL=/bin/bash HOME=/ * * * * * echo ‘Run this command every minute’
Эта конкретная задача будет возвращать «Run this command every minute», а этот вывод будет отправляться каждую минуту на адрес электронной почты, заданный директивой MAILTO.
Чтобы добавить вывод запланированной команды в файл журнала, добавьте » в конец команды, после чего укажите имя и расположение файла журнала, как показано здесь:
* * * * * echo ‘Run this command every minute’ >> /directory/path/file.log
Эта задача cron также перенаправляет стандартную ошибку — представляемую как 2 — в стандартный вывод (>&1). Поскольку стандартный вывод уже перенаправляется в директорию /dev/null, это позволяет запускать скрипт без лишнего шума. Даже если в crontab содержится оператор MAILTO, вывод команды не будет отправляться на заданный адрес электронной почты.
* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1
Примеры
Команда | Описание |
---|---|
* * * * * | запускать команду каждую минуту |
12 * * * * | запускать команду 12 минут в начале каждого часа |
*/5 * * * * | Запускать каждые 5 минут |
0,15,30,45 * * * * | запускать команду каждые 15 минут |
*/15 * * * * | запускать команду каждые 15 минут |
0 4 * * * | запускать команду каждый день в 4:00 |
0 4 * * 2-4 | запускать команду каждый вторник, среду и четверг в 4:00 |
20,40 */8 * 7-12 * | запускать команду в 20-ю и 40-ю минуту каждого 8-го часа каждый день последних 6 месяцев года |
0 9,18 * * 1 /home/ivan/script.sh | Запуск скрипта каждый понедельник в 9:00 и 18:00 часов |
30 */12 * * * script.sh | Запуск скрипта каждый день в 0:30 и 12:30 |
0 12 1 * * command | Запуск команды каждый месяц 1 числа в 12:00 |
0 0 * * 1-5 /home/ivan/script.sh | Запуск скрипта в полночь с понедельника по пятницу |
Если вы найдете что-то из этого затруднительным или вам потребуется помощь при написании расписания для ваших собственных задач cron, Cronitor предоставляет удобный редактор выражений cron, который называется Crontab Guru и который вы можете использовать для проверки действительности ваших расписаний cron.
Логи
tail -f /var/log/syslog | grep CRON journalctl -u cron.service