Настройка 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 каждое воскресенье.

В docker нужно запускать повторяющийся процесс, плюс еще другие процессы

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

Снова пишем файл cron. Для того чтобы создать файл с текущим timestamp нужно
выполнить вот такую команду:

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

В качестве веб сервера можно использовать кучу всего. Например, можно использовать
python однострочник,
но в этом примере я буду использовать nginx. Создаем файл nginx.conf:

А дальше начинается специфика докера. В контейнере может быть запущен только один
главный процесс. Поскольку нам нужно запустить сразу 2 процесса, то нам нужна еще
некая обертка которая запустит оба эти процесса. Вот эта обертка — это программа
supervisor, штука, которая позволяет запускать другие процессы.

Пишем файл supervisor.conf, в нем описываем оба процесса которые нужно будет запускать:

И дальше пишем Dockerfile:

Собираем образ:

И запускаем его:

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

Можно зайти в контейнер и увидеть иерархию процессов:

Использование incron

Поскольку incron является в некоторой степени «родственником» cron, то и принципы использования этих программ и их пользовательский интерфейс также схожи между собой. Каждый пользователь, обладающий правами для работы с incron, обращается к программе incrontab для просмотра или редактирования списка своих правил (задач). Программа-демон (incrond) обрабатывает эти правила, и при наступлении события, указанного в одном из правил, выполняет соответствующую команду.

Для просмотра текущей таблицы правил используется команда incrontab -l, а для редактирования правил — команда incrontab -e. Редактирование выполняется с помощью текстового редактора, определённого в системной переменной EDITOR. Если для работы с таблицей incrontab необходимо выбрать другой редактор, не изменяя значения EDITOR, то в конфигурационный файл /etc/incron.conf следует вписать следующую строку:

editor = имя_требуемого_редактора

При этом следует помнить о предупреждении автора программы Лукаса Елинека, который не рекомендует использовать редакторы с графическим интерфейсом (gvim, KEdit, gedit и т.п.) из-за возможных проблем при взаимодействии с X-сервером. Более предпочтительны в данном случае такие редакторы, как vim, emacs, nano и т.д.

С помощью команды incrontab -r пользователь может удалить свою текущую таблицу правил, при этом никаких предупреждений и запросов на подтверждение удаления не выводится, поэтому этой командой следует пользоваться с осторожностью. После добавления всех необходимых правил в таблицу, её можно сохранить в файле с помощью следующей команды:

incrontab -l &gt; myincrontab.backup

Однако восстанавливать правила в случае удаления таблицы все равно придётся вручную.

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

  incrond -k
  incrond --kill

После установки пакета incron может случиться так, что никто из пользователей (в том числе и суперпользователь root) не будет иметь прав на работу с таблицами правил. В этом случае потребуется добавить имена учетных записей пользователей, допущенных к работе с incron, в файл /etc/incron.allow. Иногда встречаются советы удалить файл /etc/incron.allow для того, чтобы все локальные пользователи получили доступ к incron, но этот шаг выглядит чрезмерным и небезопасным (сам автор программы признаёт это и намеревается в следующих версиях усовершенствовать механизм разрешения доступа).

Как работает крон (шаг за шагом)

  1. При посещении любой страницы сайта (при любом запросе к сайту), в том числе при AJAX, REST запросах, т.е. всегда на событии init срабатывает функция wp_cron().

    if ( ! defined( 'DOING_CRON' ) )
    	add_action( 'init', 'wp_cron' );
  2. wp_cron() проверяет существует ли хоть одно задание с подошедшем временем. Если есть, то вызывает функцию spawn_cron().

  3. spawn_cron() запускает крон! Отправляет не блокирующий HTTP запрос на файл крона /wp-cron.php в котором передает текущую метку времени вида: microtime(true), например: 1538326680.8330409526824951171875.

    Тут проверяется, когда был в последний раз запущен крон, если менее 60 секунд, то функция ничего не делает. Изменить этот интервал можно через константу WP_CRON_LOCK_TIMEOUT. Указать в константе можно максимум 600 (10 минут), если указать больше, то она будет игнорироваться. Пример:

    define( 'WP_CRON_LOCK_TIMEOUT', 60 )

    Далее проверяется есть ли хоть одно подошедшее задание, если есть то во временную опцию ‘doing_cron’ записывается текущая метка времени, когда был запущен крон и отправляется неблокирующий запрос на файл /wp-cron.php, там эта метка времени используется для разных проверок.

  4. Файл /wp-cron.php опять проверяет: не запускался ли недавно крон (менее 60 сек назад), есть ли подошедшие крон задания.

    Далее, проходит по всем «поспевшим» задачам и для каждого из них: удаляет текущую задачу из расписания, и если у задачи есть метка schedule, (оно повторяющееся), создает новое такое же задание с помощью функции wp_reschedule_event(). Новое задание будет выполнено через указанный в интервале промежуток времени.

    Далее, запускается указанный при регистрации крон задачи хук-событие, т.е. запускается текущее задание:

    do_action_ref_array( $hook, $v );

    Если обращаться к файлу /wp-cron.php напрямую, то он будет отрабатывать только раз в WP_CRON_LOCK_TIMEOUT секунд (60 секунд).

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

Заметки

Все крон задачи хранятся в опции get_option( ‘cron’ ).

Крон запрос запускается отдельно от текущей загрузки страницы и в нем отдельно грузится среда ВП и т.д. Текущий запрос (посещение страницы) только инициализирует крон (создает запрос на файл крона), если время подошло.

Другими словами: крон задачи выполняются асинхронно. Т.е. для выполнения ожидаемых крон задач, WordPress отправляет запрос на файл http://example.com/wp-cron.php. Этот файл самодостаточный: он устанавливает константу define(‘DOING_CRON’, true), затем подгружает среду WordPress и выполняет все ожидаемые задачи.

Настройка 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 — каждый час.

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

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

#!/bin/bash

……

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

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

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

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

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

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

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

«Сделал работу и ухожу»

Как уже было отмечено, если некоторое задание не было выполнено демоном
crond в указанное время
(например, компьютер был выключен), то процесс crond не выполняет такую команду позже, поскольку
информация о невыполнении задания ему не поступает. А для некоторых системных заданий такое
явление недопустимо.

Эту проблему позволяет решить другой системный демон, имя которого anacron.
В отличие от cron, он работает по следующему принципу. При запуске
(а запускается он во время старта системы из инициализационных скриптов)
он просматривает свой
конфигурационный файл (обычно /etc/anacrontab), в котором для каждого задания указывается
периодичность (в сутках), с которой должно повторяться выполнение этого задания. Далее
anacron проверяет, выполнялось ли данное задание в течение последних n дней. Если нет,
anacron запускает на выполнение команду, указанную в строке задания. При этом выполнение
команды может осуществляться с некоторой задержкой, величина которой (в минутах) должна быть
указана в строке задания. После выполнения задания anacron записывает дату
выполнения в
специальный файл, содержащий записи о времени последнего выполнения данного задания, чтобы знать, когда надо
выполнять это задание снова. Эти файлы сохраняются в каталоге /var/spool/anacron. В файл
записывается только дата, часы и минуты не запоминаются.

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

Конфигурационный файл /etc/anacrontab может содержать строки трех типов: строки описания
заданий, строки задания переменных окружения и строки комментариев. Строка описания заданий имеет
следующий формат:

          период  задержка  идентификатор_задания  команда

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

Строки задания переменных имеют стандартный формат:

          ИМЯ_ПЕРЕМЕННОЙ = ЗНАЧЕНИЕ

В качестве строк комментария может выступать пустая строка, строка состоящая только из
пробелов или строка, содержащая произвольную последовательность символов, начинающуюся символом
‘#’ (перед которым может стоять любое количество пробелов).

Приведу в качестве примера файл /etc/anacrontab из стандартной установки дистрибутива Red Hat
Linux:

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# These entries are useful for a Red Hat Linux system.
1	5	cron.daily		run-parts /etc/cron.daily
7	10	cron.weekly		run-parts /etc/cron.weekly
30	15	cron.monthly		run-parts /etc/cron.monthly

Как видите, в Red Hat утилита anacron «подстраховывает» демон cron, запуская периодические
задания cron-а, если последний почему-либо их не запускал. Благодаря этому, в частности, скрипт
logrotate регулярно (точнее, при каждом запуске компьютера) выполняется,
несмотря на то, что демоном crond он не
запускается из-за выключения компьютера на ночь.
Среди регулярно запускаемых cron-ом скриптов (в каталогах
/etc/cron.daily, /etc/cron.weekly и /etc/cron.monthly) вы найдете скрипт
0anacron, который заботится о том, чтобы обновить записи о времени последнего
выполнения тех заданий, которые поручены обеим демонам (чтобы
исключить их повторное выполнение anacron-ом).

При желании можно, очевидно, сделать так, чтобы cron, в свою очередь,
«подстраховывал» anacron, периодически запуская его (хотя проще просто поручить
периодические задания cron-у).

Демон anacron запускается при старте системы и, выполнив предписанные
ему задания, завершает работу. Наверное поэтому нет никаких утилит, специально предназначенных
для ввода новых заданий демону anacron. Такие задания может давать только суперпользователь
путем прямого редактирования файла /etc/anacrontab. По-видимому, основное назначение
этого демона — выполнять какие-то работы по обслуживанию системы после периодов долгого простоя.

Crontab format

The basic format for a crontab is:

minute hour day_of_month month day_of_week command
  • minute values can be from 0 to 59.
  • hour values can be from 0 to 23.
  • day_of_month values can be from 1 to 31.
  • month values can be from 1 to 12.
  • day_of_week values can be from 0 to 6, with 0 denoting Sunday.

Spaces are used to separate fields. To fine-tune your schedule you may also use one of the following symbols:

Symbol Description
* Wildcard, specifies every possible time interval
, List multiple values separated by a comma.
Specify a range between two numbers, separated by a hyphen
Specify a periodicity/frequency using a slash

For example, the line:

*/5 9-16 * 1-5,9-12 1-5 ~/bin/i_love_cron.sh

will execute the script at five minute intervals from 9 AM to 4:55 PM on weekdays except during the summer months (June, July, and August).

In addition, crontab has some special keywords:

@reboot at startup 
@yearly once a year
@annually ( == @yearly)
@monthly once a month
@weekly once a week
@daily once a day
@midnight ( == @daily)
@hourly once an hour

For example:

@reboot ~/bin/i_love_cron.sh

will execute the script at startup.

More examples and advanced configuration techniques can be found below.

How to view /etc/crontab on Linux or Unix

A cronjob can be also run from /etc/crontab file. To view it run the following less command:
Sample outputs:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
 
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 
# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

Crontab file

Crontab syntax :
A crontab file has five fields for specifying day , date and time followed by the command to be run at that interval.


* in the value field above means all legal values as in braces for that column.

The value column can have a * or a list of elements separated by commas. An element is either a number in the ranges shown above or two numbers in the range separated by a hyphen (meaning an inclusive range)NotesA. ) Repeat pattern like /2 for every 2 minutes or /10 for every 10 minutes is not supported by all operating systems. If you try to use it and crontab complains it is probably not supported.

B.) The specification of days can be made in two fields: month day and weekday. If both are specified in an entry, they are cumulative meaning both of the entries will get executed .

Примеры 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

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

Shortcuts

The /etc/anacrontab file shown above shows us a clue to how we can use shortcuts for a few specific and common times. These single-word time shortcuts can be used to replace the five fields usually used to specify times. The @ character is used to identify shortcuts to cron. The list below, taken from the crontab(5) man page, shows the shortcuts with their equivalent meanings.

  • @reboot : Run once after reboot.
  • @yearly : Run once a year, ie. 0 0 1 1 *
  • @annually : Run once a year, ie. 0 0 1 1 *
  • @monthly : Run once a month, ie. 0 0 1 * *
  • @weekly : Run once a week, ie. 0 0 * * 0
  • @daily : Run once a day, ie. 0 0 * * *
  • @hourly : Run once an hour, ie. 0 * * * *

These shortcuts can be used in any of the crontab files, such as those in /etc/cron.d.

Историческая справка

Утилита была разработана ещё в начале 70-х годов прошлого столетия, когда Кен Томпсон и Деннис Ритчи создали ОС UNIX. Они работали над проектом по созданию многозадачной и многопользовательской системы Multics, в котором принимали участие компании AT&T и Bell Labs. В то время подобная система была настолько высокотехнологичным и прорывным продуктом, что позже Bell Labs отказалась от активного участия в проекте из-за крайне низкой востребованности подобного рода систем для широкого потребления.
Однако, используя наработки из проекта Multics, Томпсон и Ритчи на этой основе и на волне энтузиазма создали ОС UNIX. Такая мощная и прорывная платформа для полноценного раскрытия своего функционала нуждалась в обеспечении её функционалом в виде специализированного ПО и утилит, одной из которых и по сей день является cron. Разработчиком утилиты является Кен Томпсон.

Пример

Рассмотрим пример создания файла crontab для пользователя user ,домашняя директория /home/user

Задача: запускать каждую минуту файл /home/user/mail, который будет отправлять почту

#содержимое файла mail (файл должен быть с правами на запуск! например -rwxr-xr-x)
#!/bin/bash
mess="test cron"
echo "$mess" |mutt -s "subj" -m application/octet-stream bob@server.ru

1.Создаем временный файл /home/user/test содержимое файла test такое:

SHELL=/bin/bash
MAILTO=user
0-59 * * * * /home/user/mail

2. Запускаем в терминале команду crontab /home/user/test

Все. После этого в каталоге /var/spool/cron будет создан файл «user» примерно с таким содержимым

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/home/user/test installed on Mon Mar 29 02:31:34 2004)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
SHELL=/bin/bash
MAILTO=user
0-59 * * * * /home/user/mail

и файл /home/user/mail будет запускаться демоном cron каждую минуту.

Доступ в каталог /var/spool/cron непривилегированому пользователю закрыт, что бы посмотреть юзером «user»
есть ли у него файл crontab ,достаточно набрать команду crontab -l , если файл существует-будет показано его
содержимое.

Для удаления файла используется команда crontab -r

Для редактирования crontab -e

Для управления файлами crontab пользователем «root» используется синтаксис:

-------------------------
crontab -u user_name file       -создание файла crontab
-------------------------        из файла "file" для
                                  юзера "user_name"

-u означает чей crontab будет обработан, Если опция не задана, то будет обработан crontab того
пользователя, который запустил команду crontab.

-------------------------
crontab -u user_name -l       -просмотр файла crontab
-------------------------       юзера "user_name"

-------------------------
crontab -u user_name -r       -удаление файла crontab
-------------------------       юзера "user_name"

-------------------------
crontab -u user_name -e       -редактирование файла crontab
-------------------------      юзера "user_name" используя
                               редактор, заданный переменной
                               окружения VISUAL или EDITOR

Интервалы для крон задач

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

По умолчанию в WP три интервала:

'hourly'     => array( 'interval' => HOUR_IN_SECONDS,      'display' => __( 'Once Hourly' ) ),
'twicedaily' => array( 'interval' => 12 * HOUR_IN_SECONDS, 'display' => __( 'Twice Daily' ) ),
'daily'      => array( 'interval' => DAY_IN_SECONDS,       'display' => __( 'Once Daily' ) ),

Добавлять новый интервал Cron нужно через фильтр cron_schedules.

Добавим интервал «5 минут» (делать что-либо каждые 5 минут):

// регистрируем 5минутный интервал
add_filter( 'cron_schedules', 'cron_add_five_min' );
function cron_add_five_min( $schedules ) {
	$schedules = array(
		'interval' => 60 * 5,
		'display' => 'Раз в 5 минут'
	);
	return $schedules;
}

Код создания интервала должен срабатывать всегда, так как данные об интервалах не хранятся в базе данных, а используются они постоянно. При выполнении одной крон задачи, WP создает такое же задание, а метку времени этого нового задания вычисляет на основе указанного имени интервала. И поэтому данные интервала нужны всегда!

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

Теперь можно использовать этот интервал при создании крон-задачи:

// регистрируем событие
add_action( 'wp', 'my_activation' );
function my_activation() {
	if ( ! wp_next_scheduled( 'my_five_min_event' ) )
		wp_schedule_event( time(), 'five_min', 'my_five_min_event' );
}

// функция крон-задачи
add_action( 'my_five_min_event', 'do_every_five_min' );
function do_every_five_min(){
	// делаем что-либо каждые 5 минут
}

Константы WordPress которые могут пригодится при создании крон интервала:

  • — час в секундах — 60*60 = 3600
  • — день в секундах — 60*60*24 = 86400
  • — неделя в секундах — 60*60*24*7 = 604800
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector