cron

Cron — это планировщик задач, используемый для выполнения задач (в фоновом режиме) в указанное время.

Crontab — команда, которая используется, для управления планировщиком Cron. Команда crontab создает файл crontab, содержащий команды и инструкции для запуска демона 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 -e Редактирование или создание файла расписания для текущего пользователя
crontab -l Вывод содержимого расписания текущего пользователя
crontab -r Удаление файла расписания текущего пользователя
crontab -u userРабота с расписаниями конкретных пользователей. Доступно только суперпользователю

/* Cron */


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

Поле Диапазон значений
minute0-59Минута запуска команды
hour0-23Час запуска
day1-31Число (день) запуска
month1-12Месяц запуска
weekday0 - 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 * * * ….
@hourly0 * * * *
@midnightВ полночь (00:00)
@daily0 0 * * *
@weekly0 0 * * 0
@monthly0 0 1 * *
@yearly или @annually0 0 1 1 *
@reboot echo "System start up"Запуск после перезагрузки
Примечание. Вы не можете выражать значения шага произвольно, допускается использование только целых чисел, которые равномерно делят диапазон, допустимый для данного поля. Например, в поле «часы» вы можете указать после косой черты только 1, 2, 3, 4, 6, 8 или 12.

Например, вы можете добавить следующие строки в файл 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