Настройка простой задачи cron на linux

Краткое введение в ключевые концепции cron

Позвольте сначала познакомить вас с некоторой базовой концепцией «cron».

Разница между Cron, Crontab и Cron Job

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

Элемент Имя Linux Смысл
Daemon (Демон) ‘crond’ Произносится «demon» или «day-mon». Это фоновые системные процессы Linux.
Table (Таблица) ‘crontab’ Вы записываете строки в эту таблицу при вводе команды crontab. Каждая звездочка «*» представляет отрезок времени и соответствующий столбец в каждой строке.
Job (Задача) Cron Job Конкретная задача, которая должна быть выполнена, описана в строке в сочетании с назначенным ей идентификатором времени

Таблица Cron

Crontab означает Cron Table. Это системный файл Linux, который создает табличную структуру, в которой поля разделяются пробелами. Пользователи могут заполнять таблицу, присваивая значения каждому полю (звездочка).

Если это поможет, вы можете думать о вашем crontab как о мини-базе данных.

Cron Job

Если вы не знакомы с базами данных, вы можете представить ячейки в пустом файле Excel. В любом случае, для этой аналогии каждая звездочка представляет столбец, значение которого определяется его заголовком. Последний столбец будет вызовом команды или сценария. Каждый полный ряд можно рассматривать как отдельную работу. Их часто называют “cron jobs”, хотя работа, задание и т. д. Являются взаимозаменяемыми терминами.

Демон Cron

Мы уже обсуждали таблицу и как мы заполняем ее рабочими местами. Но как эти работы выполняются? Системный процесс под названием Daemon выполняется на фоне нашего Linux-компьютера.

Есть демоны для разных сервисов. Обычно они называются суффиксом «d» к имени службы.

Естественно, демон cron называется «crond». С нашей стороны не требуется никаких действий для запуска этого демона, но если вы считаете, что команда не работает должным образом, вы можете использовать команду ps, чтобы убедиться, что crond запущен.

ps aux | grep crond

Эта команда будет искать текущие процессы для всех пользователей и возвращать любые экземпляры ‘crond’.

andreyex@destroyer:~$ ps ux | grep crond
andrey+  4352  0.0  0.0  18612   840 pts/0    S+   02:16   0:00 grep --color=auto crond

Мы видим, что демон запущен для нашей учетной записи.

Понимание синтаксиса Crontab

Теперь, когда у вас есть смутное представление о том, как работает cron, давайте посмотрим на синтаксис использования crontab. Мы надеемся, что это менее запутанно, если вы можете представить эту информацию в виде таблицы в вашем уме.

crontab 

* * * * *  <command> 
OR 
* * * * * <path/to/script>

Мы обещаем, что это произойдет, потому что для вас, как только мы приведем в действие наш собственный пример. Давайте снова рассмотрим синтаксис для заданий cron.

Как видите, синтаксис crontab состоит из 5 звездочек. Вот что представляет каждая из этих звездочек:

первая вторая третья четвёртая пятая
* * * * *
ID Минуты Часы День Месяц Название дня
Values 0-59 0 -23 1-31 1-12 0-6

ПРИМЕЧАНИЕ
названия дней от 0-6 начинаются с воскресенья.

Чтобы запланировать задачу, вы заменяете соответствующую звездочку на желаемое значение.

Давайте немного потренируемся. Если у вас есть crontab, подобный приведенному ниже, как вы думаете, когда работа будет запущена?

0 0 * * 0

Вопрос: Когда команда будет запущена, если вы зададите задание таким образом?

A. Каждый час с понедельника по субботу
B. Каждая минута по воскресеньям
C. Только в полночь с понедельника по субботу
D. Только в полночь по воскресеньям

Ответ здесь . Выполнять «команду» в 00:00 каждое воскресенье.

Функционал и основные компоненты примеры cron

Описания регулярных действий, запускаемых утилитой– это так называемая crontab-таблица, которая имеет строго определенный формат. Она состоит из 6 колонок, разделённых табуляторами или пробелами, первые 5 из которых определяют время запуска действия. Последняя колонка интерпретируется как команда запуска, т. е. само действие.

0 5 * * 1 tar -zcf var/backups/home.tgz /home/

Приведённое описание действия означает запуск резервного копирования (путём архивирования и помещения созданного архива в var/backups/) всех каталога /home каждую неделю (по понедельникам) в 5 утра. Как видно, сначала задаётся колонка минут, затем часов, дней, месяцев и дней недели. Далее следует команда запуска, в данном случае для создания архива. В колонках, определяющих время могут использоваться числа, группы чисел, разделяемых запятыми, диапазоны чисел, разделяемых дефисом, а также символы «*» и «/». Каждому действию соответствует строка описания в crontab-файле. В приведённом примере цифра «1» означает порядковый номер дня недели — понедельник, соответственно «2» — вторник, «3» — среда и т. д., причём воскресенье это «0» или «7». Символ «*» означает любое значение с учётом валидности для соответствующего параметра. Для задания шага значений используется символ «/», например:

23 */2 * * * echo "Выполняется в 0:23, 2:23, 4:23 и т. д."

Пример настройки планировщика на выполнение задачи каждые 5 минут выглядит так

*/5 * * * * echo "Выполняется каждые 5 минут"

Каждую минуту

*/1 * * * * echo "Выполняется каждую минуту"

Каждый час

* */1 * * * echo "Выполняется каждый час"

каждое первое число февраль, июль и ноябрь в 2.30

10 00 01 02,07,11 * echo "каждое первое число февраль, июль и ноябрь в 0.10"

Каждые полчаса:

00,30 * * * * echo "каждые полчаса"

По выходным

* * * * 6,7 echo "суббота и воскресенье"

трижды в день:

00 10,15,20 * * * echo "будет выполняться каждый день в 10.00 и 15.00, 20.00"

один раз в день с 00 до 09 часов по буднем.

00 00-09 * * 1-5 echo "будет выполняться с 00 до 09 часов по буднем"

Для добавления скрипта в крон нужно прописать полный путь к скрипту. Пример

00 01 * * * /etc/scripts/script.sh

В данном примере скрипт /etc/scripts/script.sh будет запускаться каждый день в час ночи. Существуют два типа crontab-файлов: системные и пользовательские. В отличие от пользовательских, в системных после колонок задания времени используется еще колонка для указания пользователя, от которого выполняется действие:

17 * * * * root cd / && run-parts —report /etc/cron.hourly

Кроме того, местоположение системных и пользовательских crontab-файлов различается: файлы, используемые для действий, управляющих системой находятся в /etc/cron.d/, а файлы, создаваемые для отдельных пользователей хранятся по адресу /var/spool/cron/crontabs/.
Для корректной работы утилиты необходимо в файлах crontab указывать оболочку командного интерпретатора, а также добавлять домашний каталог пользователя в PATH:

SHELL=/bin/sh
PATH=/bin:/usr/bin:/home/paul/bin

При необходимости можно также указать электронный адрес пользователя:

MAILTO=user@example.org

Примеры Crontab: планирование команд и скриптов

Мы показали вам пару примеров, как выводится информация. Это имело для вас смысл?

Позвольте пройти первый пример.

Minute | Hour | Day-Date | Month | Day Name | Command
|—–|——|—–|—–|—–|—–|—–|
| 0 | * | * | * | * | echo “Linux is Cool!” >> ~/crontab_log.txt |

Установка минутного значения в «0» означает, что команда будет выполняться каждый час в час.

Расширенные графики работы

Вы можете редактировать несколько значений одновременно. Если вы хотите, вы можете заменить все 5 звездочек со спецификациями.

Minute | Hour | Day-Date | Month | Day Name | Command
|—–|——|—–|—–|—–|—–|—–|
|*/5 | 3-6 | */5 | */2 |0,6| echo “Linux is Cool!” >> ~/crontab_log.txt |

Есть идеи, что говорит этот? Ради этого урока мы сделал эту работу особенно запутанной. Было бы необычно иметь что-то с таким большим количеством параметров «в дикой природе», но давайте посмотрим, сможете ли вы расшифровать это.

Давайте попробуем это вместе:

поле Ценность Смысл
Day Name 0,6 Суббота и воскресенье
Month * / 2 Каждый месяц, который делится на 2, месяц.
Day Date * Каждый день
Hour 3-6 С 3 до 6 утра
Minutes * / 5 Каждые 5 минут

На простом языке:

Таким образом, каждый второй месяц, по выходным, независимо от даты, эта команда будет выполняться каждые 5 минут между 3 утра и 6 утра.

Вау, это было запутанно. Если вы смогли следовать этому, вы готовы справиться с лучшими из них.

Напишите простой скрипт автоматизации cron для резервного копирования файлов.

До этого момента написанные вами задания cron делали только одно. Это может быть полезно, но, возможно, вы хотите сделать несколько задач.

К счастью, это не только возможно, но и очень просто. Если вы помните из исходного примера синтаксиса, вы также можете использовать путь к сценарию.

Это не ограничивается только bash, вы также можете реализовать скрипт, который использует Python или Perl, если хотите.

Каковы наши цели?

  • Работа будет обрабатываться в 3 часа ночи каждую ночь
  • Резервное копирование папку /Documents в zip-файл
  • Создайте текстовый файл со списком всего в каталоге
  • Создайте архивную папку, которая клонирует нашу резервную копию и текстовый файл в подпапку с текущей датой

our_backup_script.sh

#! /bin/bash

DATE=$(date +%d-%m-%Y)
# Date in format DAY##-MONTH##-YEAR####

mkdir -p ~/archive/$DATE
# создайте папку для сегодняшней даты в архиве, если архив не существует, сделайте архив 
ls -al ~/Documents > ~/archive/$DATE/contents.txt
# создайте текстовый файл со списком содержимого папки документы
cd ~/  && tar -cpzf $DATE.docs.backup.gz Documents/*
# перейдите в родительский каталог в папку tar / Documents
cp ~/$DATE.docs.backup.gz ~/archive/$DATE/documents_archive.gz
# один файл .gz остается в домашнем каталоге, дубликат отправляется в наш архив под его датой
andreyex@destroyer:~$ ls
 Desktop     Downloads   Music                  Pictures   Public      Videos
 Documents   ENV         our_backup_script.sh   projects   Templates  'VirtualBox VMs'
andreyex@destroyer:~$ bash our_backup_script.sh 
andreyex@destroyer:~$ ls
 25-11-2019.docs.backup.gz   Documents   Music                  projects    Videos
 archive                     Downloads   our_backup_script.sh   Public     'VirtualBox VMs'
 Desktop                     ENV         Pictures               Templates
andreyex@destroyer:~$ ls archive/25-11-2019/
contents.all_files.txt  documents_archive.gz

Все, что осталось сделать, сделать этот скрипт работой cron.

crontab -e

И добавьте туда следующее:

0 3 * * * bash ~/our_backup_script.sh

На самом деле, идея очень понравилась, мы могли бы просто сохранить это как ежедневную резервную копию. Одна из модификаций, которую мы сделали, – это переместить архив в папку на нашу машине, которая синхронизируется с облачным хранилищем.

Настройка Cron

Для настройки времени, даты и интервала когда нужно выполнять задание используется специальный синтаксис файла cron и специальная команда. Конечно, вы всегда можете отредактировать файл /etc/crontab, но этого делать не рекомендуется. Вместо этого, есть команда crontab:

Ее всегда желательно выполнять с опцией -e, тогда для редактирования правил будет использован ваш текстовый редактор по умолчанию. Команда открывает вам временный файл, в котором уже представлены все текущие правила cron и вы можете добавить новые. После завершения работы команды cron файл будет обработан и все правила будут добавлены в /var/spool/cron/crontabs/имя_пользователя причем добавленные процессы будут запускаться именно от того пользователя, от которого вы их добавляли.

Поэтому тут нужно быть аккуратным, и если вам нужно выполнять скрипты от рута, то и crontab нужно выполнить от рута, а не от пользователя. Это часто становится причиной проблем.

Синтаксис crontab

Как я уже говорил, время задается особым синтаксисом, давайте рассмотрим синтаксис настройки одной задачи cron:

минута час день месяц день_недели /путь/к/исполняемому/файлу

Нужно сказать, что обязательно нужно писать полный путь к команде, потому что для команд, запускаемых от имени cron переменная среды PATH будет отличаться, и сервис просто не сможет найти вашу команду. Это вторая самая распространенная причина проблем с Cron. Дата и время указываются с помощью цифр или символа ‘*’. Этот символ означает, что нужно выполнять каждый раз, если в первом поле — то каждую минуту и так далее. Ну а теперь перейдем к примерам.

Примеры настройки cron

Сначала можно посмотреть задачи cron для суперпользователя, для этого можно воспользоваться опцией -l:

Вы можете удалить все существующие задачи командой -r:

Давайте предположим, что нам нужно запускать от имени суперпользователя наш скрипт по адресу /usr/local/bin/serve. Какой-нибудь обслуживающий скрипт. Самый простой пример — запускать его каждую минуту:

Далее, усложним, будем запускать каждый час, в нулевую минуту:

Еще дальше:

Запускаем в нулевую минуту нулевого часа, каждый день, это в 12 ночи:

Если идти так дальше, то можно запускать в первый день каждого месяца:

Можно в любой день, например, 15 числа:

В первый день недели первого месяца года, 0 часов 0 минут:

Или в нулевой день недели каждого месяца:

Вы можете выбрать любую минуту, час и день недели, например, 15.30 во вторник:

Понедельник считается первым днем, воскресенье — это седьмой или нулевой день. Еще можно писать сокращенное название дня недели, например sun — воскресенье:

Для того чтобы указать определенный интервал нужно использовать символ «-«, например, каждый час, с семи утра до семи вечера:

Если нужно запустить команду несколько раз, можно использовать разделитель «,». Например, запустим скрипт в 5 и 35 минут пятого (16:05 и 16:35), каждый день:

Вы можете захотеть не указывать отдельно время, а просто указать интервал, с которым нужно запускать скрипт, например, раз в 10 минут. Для этого используется разделитель косая черта — «/»:

Кроме того, для некоторых часто используемых наборов были придуманы переменные, вот они:

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

Например, вот так просто будет выглядеть команда запуска скрипта раз в час:

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

Скрипт должен выглядеть подобным образом. Теперь вы знаете как настроить cron, осталось проверить как все работает.

Отладка работы

После того как вы настроили правила, еще хотелось бы проверить работают ли они. Для этого ждем того времени, когда скрипт уже должен быть выполнен и смотрим лог cron. Иногда он находится в /var/log/cron, а иногда пишется в syslog. Например, у меня в crontab есть такая строка:

Она должна выполняться в 19.40 каждый день, теперь смотрим лог:

И видим что в нашем логе она действительно есть и выполняется целиком успешно. Если бы были какие-либо ошибки, то тут же было бы выведено сообщение.

Если нужно проверить скрипт, который находится в одной из специализированных папок, то тут еще проще, просто запустите run-paths, передав ей в параметр нужную папку или даже сам скрипт:

Дальше вы увидите весь вывод, включая вывод скрипта и сможете быстро понять в чем проблема.

Управление файлами crontab

После настройки расписания и определения задания, которое нужно запустить, вам нужно будет поместить его в место, где ваш демон сможет его прочитать.

Как уже упоминалось выше, crontab — это специальный файл, где содержится расписание задач, которые cron будет запускать. Однако эти данные не предназначены для редактирования напрямую. Вместо этого рекомендуется использовать команду . Она позволяет изменять файл crontab вашего профиля без внесения изменений в ваши права с помощью . Команда также позволит вам понять, есть ли в crontab ошибки синтаксиса, независимо от того, редактируете вы его или нет.

Вы можете изменить файл crontab с помощью следующей команды:

Если вы впервые запускаете команду в этом профиле пользователя, вы сможете выбрать используемый по умолчанию текстовый редактор для использования при редактировании crontab:

Введите число, соответствующее нужному вам редактору. Кроме того, вы можете просто нажать , чтобы использовать вариант по умолчанию, .

После выбора вы попадете в новый файл crontab, содержащий ряд закомментированных инструкций по его использованию:

При запуске в следующий раз, ваш файл будет автоматически открываться в этом текстовом редакторе. После входа в редактор вы можете ввести свое расписание для каждой задачи в новой строке. В противном случае вы можете сохранить изменения и закрыть файл crontab (, , а затем , если вы выбрали ).

Примечание. В системах Linux имеется другой файл crontab, сохраненный в директории . Это системный файл crontab, где имеется дополнительное поле, определяющее, для какого профиля пользователя должна запускаться каждая команда cron. В этом обучающем руководстве мы будем использовать файл crontab для конкретного пользователя, но если вы хотите изменить системный файл crontab, вы можете сделать это с помощью следующей команды:

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

Вы можете стереть файл crontab с помощью следующей команды:

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

Эта команда удаляет файл crontab пользователя немедленно. Однако вы можете включить флаг , чтобы добавить в команду подтверждение того, что вы действительно хотите удалить пользовательский файл crontab:

После получения запроса вы должны ввести , чтобы удалить файл crontab, или , чтобы отменить удаление.

Добавление команды в cron

Чтобы добавить задание cron из терминала можно использовать утилиту crontab. Для открытия временного файла с текущими заданиями этого пользователя выполните:

Все запланированные действия будут выполнятся от текущего пользователя, если вы хотите указать другого пользователя используйте опцию -u:

Команда откроет текстовый редактор, где вы сможете добавлять или редактировать задания cron. Будет использован установленный по умолчанию редактор, например, vim:

Каждая задача формируется следующим образом:

минута(0-59) час(0-23) день(1-31) месяц(1-12) день_недели(0-7) /полный/путь/к/команде

Чтобы подставить любое значение используйте звездочку «*». Первые пять параметров характеризуют время выполнения, а последний, это путь к команде или скрипту, который нужно выполнить

Обратите внимание, что значение переменной PATH здесь не действует, поэтому путь надо писать полностью либо объявлять свою переменную PATH в начале файла настройки. Давайте сделаем простой скрипт, который будет выводить в лог дату своего запуска и поможет отладить всё это:

Сделайте скрипт исполняемым:

Самый простой пример как запускать cron каждую минуту. Вместо всех параметров ставим просто звездочку:

Или только в нулевую минуту, то есть в начале каждого часа или другими словами запуск cron каждый час:

Можно указать несколько значений через запятую, для того чтобы определить несколько точек запуска. Например, будем запускать скрипт cron каждые 15 минут:

Можно записывать значения через дефис чтобы указывать промежутки точек запуска. Например, для того чтобы запускать скрипт каждую минуту, но только первые 10 минут каждого часа используйте:

Чтобы чтобы настроить интервал выполнения более тонко можно использовать слеш (/) с помощью этого символа и звездочки можно указать шаг с которым будет выполнятся команда. Например, каждые пять минут:

Чтобы запустить cron каждые 10 минут используйте:

А для запуска cron каждые 30 минут:

Аналогичным образом задаются часы, например, выполнять скрипт только 6:00 и 18:00:

А вот запустить cron каждую секунду или раз в 30 секунд не получится. Минимальная единица времени в cron это минута. Но можно создать команду, которая будет запускаться раз в минуту и по 30 секунд спать и затем снова делать:

Это довольно плохой подход и лучше так не делать. Кроме того, для экономии времени при работе с cron можно использовать специальные слова-маркеры времени. Вот они:

  • @reboot — при перезагрузке;
  • @yearly, @annually — раз в год (0 0 1 1 *);
  • @monthly — раз в месяц (0 0 1 * *);
  • @weekly — раз в неделю (0 0 * * 0);
  • @daily, @midnight — раз в день в полночь (0 0 * * *);
  • @hourly — раз в час (0 * * * *).

Когда настройка cron linux будет завершена, сохраните изменения и закройте файл. Для этого в Nano нажмите Ctrl+O для сохранения и Ctrl+X для закрытия редактора, а в Vim нажмите Esc и наберите :wq. Теперь новые задания Cron будут добавлены и активированы. Посмотреть как выполняется ваш Cron вы можете с помощью скрипта, который я привел выше либо в лог файле. Сервис cron пишет свои логи в стандартный журнал syslog. В Ubuntu они сохраняются в файле /var/log/syslog:

Если во время работы возникнут ошибки cron, они тоже будут здесь. Если же вам надо добавить задание Cron из какого либо скрипта, то вы всегда можете поместить свой скрипт в папку /etc/cron.d или /cron/hourly,… чтобы выполнять его когда надо, только не забудьте сделать скрипт исполняемым.

Добавление задания Cron в ISPmanager

В ISPmanager параметры выполнения для крона задаются в отдельных полях формы.

Команда — это путь до интерпретатора (у меня сработало просто php), пробел и полный путь до скрипта:

php /home/логин/public_html/myscript.php

*** Полный путь до скрипта включает путь к корневой директории сервера, который можно узнать, выполнив в браузере:

<?phpecho $_SERVER;?>

Период — периодичность выполнения задания можно выбрать из списка (базовый режим):каждый час — выполнение в 0 минут каждого часа.каждый день — выполнение ежедневно ровно в 00:00.раз в неделю — выполнение каждое воскресенье ровно в 00:00.раз в месяц — выполнение первого числа каждого месяца ровно в 00:00.раз в год — выполнение каждый год 1 января ровно в 00:00.

или задать вручную (экспертный режим)

Какие задачи поручить демонам?

syslogdlogrotate

Самым очевидным примером практического использования демона crond является
автоматическая выдача напоминаний о приближении каких-либо важных дат или
событий. Проще всего организовать такую процедуру с помощью почтового агента
(обычно он постоянно запущен на включенном компьютере). Например, почтовый
агент kmail из KDE позволяет просматривать сообщения из нескольких «почтовых
ящиков»

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

В книге приведено еще несколько примеров использования демона crond
для решения таких задач, как:

  • чистка временных файлов, образующихся в процессе функционирования системы,
  • организацию учета использования системных ресурсов,
  • передача служебной информации по сети в периоды низкой активности.

crond

Рассмотрим обычную житейскую ситуацию: вы набираете на домашнем компьютере
какой-то текст или корректируете исходные тексты программы и в это время
отключается электроэнергия. Событие для нашей бытовой сети, к сожалению, обычное. Покупка
источника бесперебойного питания вашим семейным бюджетом, конечно, не была предусмотрена,
а сохранять результаты работы каждые 15 минут вы тоже, в азарте работы, не удосужились.
Я попал в такую ситуацию как раз во время работы над данной статьей. И после
восстановления питания последние изменения оказались потеряны,
несмотря на то, что как раз перед отключением компьютера я их сохранил и
даже вышел из программы редактирования. Это в ДОС сохранение результатов
редактирования приводит к тому, что они тут же записываются на диск.
А в Linux относительно медленные операции чтения/записи на диск кешируются
в оперативной памяти. Это существенно повышает общую производительность системы, но,
если система почему-либо рушится, такой подход приводит к тому, что вы потеряете результаты
своей работы несмотря на то, что вовремя нажимали кнопочку «Сохранить на диске».
Вот тут нам на помощь и может прийти cron!

Идея решения проста. Напомню, что в Linux имеется специальная команда sync,
предназначенная для принудительного «сброса» содержимого временных буферов памяти на
диск . Давайте будем выполнять ее в автоматическом режиме каждые 15 (или 30) минут.
Для этого достаточно прописать в crontab-файл строку следующего вида

0,30 * * * * date; sync; echo "запись данных на диск"

Составление расписания заданий

Составление расписания — задача несложная. Расписание размещается в  отдельном файле crontab. В каждой строке файла помещается задание, которое должно быть запущено в определенное время.

Часть time-date (время-дата) состоит из пяти числовых полей, разделенных пробелами и определяющих время запуска задания:

Минуты Часы День месяца Месяц День недели
Допустимые значения: 0-59 Допустимые значения: 0-23 Допустимые значения: 0-31 Допустимые значения: 0-12. Месяц можно указать тремя первыми буквами его (английского) названия Допустимые значения: 0-7, где 0 и 7 — воскресенье

Для удобства заполнения указанных полей введены следующие правила:

  • Можно указывать значения в виде численных интервалов. К примеру, интервал 1-3 в поле часов означает 1.00, 2.00 и 3.00 пополуночи, 2-4 в поле дня недели — вторник, среду или четверг.
  • Интервалы можно задавать с шагом больше единицы. Например, чтобы указать каждый второй час, начиная с полуночи, следует установить интервал 0-23 с шагом 2 через косую черту: 0-23/2
  • Звездочка (*) указывает полный интервал значений поля — от минимального до максимального. Например, в поле дня месяца звездочка означает интервал 0-31, в поле дня недели — 0-7
  • День недели или месяц можно указать первыми тремя буквами его (английского) названия

Несколько примеров заполнения полей времени—даты:

0 1 * * *

Запуск задания ежедневно в 1.00 пополуночи

30 14 * * 0

Запуск задания по воскресеньям в 2.30 пополудни

0 23-7/2,8 * * *

Запуск задания каждые 2 часа с 23.00 до 7.00 и в 8.00

0 12 * 1 mоn

Запуск задания в полдень каждого понедельника января каждого года

0 12 2 feb *

Запуск задания в полдень второго февраля каждого года

Поле command (команда) отделено от полей времени—даты одним или несколькими пробелами и простирается до конца строки. Команды обрабатываются оболочкой /bin/sh.

Например, следующая запись в файле crontab предусматривает ежедневный запуск программы /usr/sbin/backup в 1.00 пополуночи:

0 1 * * * /usr/sbin/backup

Некоторым командам (например, mail) требуется ввод информации с устройства стандартного ввода. Это указывается при помощи знака процента (%). Первый такой знак обозначает начало стандартного ввода, каждый последующий — смену строки.

Как использовать crotab

Команда crontab используется для открытия и редактирования/добавления заданий cron. Демон cron, запущенный в Linux, выполняет запланированные задания во время, определенное в crontab ( таблица cron). Основным общесистемным файлом crontab является файл /etc/crontab.

Cron по умолчанию установлен в большинстве дистрибутивов Linux. Каждый пользователь в системе Linux может управлять своими собственными заданиями cron. Каждый пользовательский cron хранится в папке /var/spool/cron/crontabs/ (может быть разным в разных дистрибутивах). Демон cron запускает как пользовательский, так и системный crontab.

Демон Cron имеет определенный путь $PATH по умолчанию, который вы можете найти в файле /etc/crontab. Если его не определить, либо используйте абсолютный путь, либо добавьте в переменную cron $PATH. Это стоит учитывать при написании заданий.

Уведомление по почте Cron по умолчанию отправляется владельцу кронтаба. Чтобы изменить это, отредактируйте переменную среды MAILTO.

Журналы Cron хранятся в системном журнале  /var/log/syslog в системах Ubuntu/Debian и в /var/log/cron в Redhat/Rocky Linux. Вы можете отфильтровать файл журнала с помощью команды grep, чтобы проверить, успешно ли выполнено задание cron или нет.

1. Редактировать/добавить задание для Crontab

Для редактирования (существующих заданий) или добавления нового cron используйте команду crontab -e. Это откроет редактор для текущего пользователя.

Чтобы отредактировать файл crontab другого пользователя, введите:

Или просто запустите команду crontab -e, войдя в систему от имени этого пользователя.

2. Список задач Cron

Чтобы просмотреть список всех заданий текущего пользователя, введите:

Чтобы просмотреть список всех заданий cron для указанного пользователя, введите:

3. Удалить задачу cron

Чтобы удалить все задания cron текущего пользователя, выполните следующую команду:

Примечание: Это приведет к удалению всех заданий cron без запроса подтверждения.

Если вы хотите удалить в интерактивном режиме, вам нужно использовать следующую команду:

Планирование заданий с помощью Crontab

Мы можем планировать задачи, используя свой специальный синтаксис. Существуют также различные короткие ручные команды, которые могут быть использованы в файле crontab, чтобы создавать задачи с легкостью.

Синтаксис записи кронтаб должен быть следующим:

#* * * * * command to be executed
#- - - - -
#| | | | |
#| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
#| | | ------- Month (1 - 12)
#| | --------- Day of month (1 - 31)
#| ----------- Hour (0 - 23)
#------------- Minute (0 - 59)

Теперь вы знакомы с командами crontab, синтаксис и типы задач в cron, в настоящее время мы создадим несколько тестовых заданий, добавим в крон и посмотрим, как это работает. Вы можете запланировать любую из вашей повседневной задачи, добавив его с командой .

Планирование заданий для запуска каждую минуту

В этом примере мы создадим cronjob, который будет выполнять текст “Тест задачи cron выполняется каждую минуту” каждую минуту и отправить по электронной почте .

Ваше первое действие, это редактирование кронтаб с командой ниже:

crontab –e

Поместите следующий скрипт cronjob в cronjob и сохраните изменения.

SHELL=/bin/bash
HOME=/
MAILTO=”user@andreyex.ru”
#This is a comment
* * * * * echo 'Тест задачи cron выполняется каждую минуту'
:wq!

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

Планирование задания Cron в определенное время

Теперь давайте посмотрим, сценарий, если вы хотите запланировать задания cron для запуска в определенное время, как в “7:00 вечера” каждый четверг.

00 15 * * 4 sh /root/test.sh

Давайте добавим эту строку в crontabs используя следующие команды.

crontab -e
crontab: installing new crontab

В приведенном выше сценарии “00 15” относится к 3:00 PM в то время как “4” относится ко дню “четверг”.

Управление выводом задачи cron

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

Если у вас есть агент передачи почты, например, Sendmail, который установлен и настроен на сервере, вы можете отправить результат выполнения задачи cron на электронный адрес, связанный с вашим профилем пользователя Linux. Также вы можете вручную задать адрес электронной почты, указав параметр вверху crontab.

Например, вы можете добавить следующие строки в файл crontab. К ним относятся оператор , за которым следует пример адреса электронной почты, директива , которая указывает оболочку для запуска (в данном примере ), директива , указывающая путь поиска бинарного файла cron, и единственная задача cron:

Эта конкретная задача будет возвращать «Run this command every minute», а этот вывод будет отправляться каждую минуту на адрес электронной почты, заданный директивой .

Также вы можете перенаправить вывод задачи cron в файл журнала или в пустую директорию, чтобы не получать электронное сообщение с выводом.

Чтобы добавить вывод запланированной команды в файл журнала, добавьте в конец команды, после чего укажите имя и расположение файла журнала, как показано здесь:

Скажем, что мы хотим использовать cron для запуска скрипта, но скрипт при этом должен выполняться в фоновом режиме. Для этого вы можете перенаправить вывод скрипта в пустую директорию, например , которая немедленно удаляет все данные, добавляемые в нее. Например, следующая команда cron выполняет скрипт PHP и запускает его в фоновом режиме:

Эта задача cron также перенаправляет — представляемую как — в стандартный вывод (). Поскольку стандартный вывод уже перенаправляется в директорию , это позволяет запускать скрипт без лишнего шума. Даже если в crontab содержится оператор , вывод команды не будет отправляться на заданный адрес электронной почты.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: