Cron jobs

Введение

Шаблон задания для Cron выглядит примерно так:

Вот иллюстрация этого же шаблона, которую можно сохранить себе:

Формат cronjob-выражения

Звёздочками обозначены конкретные блоки времени.

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

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

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

Выбирайте на своё усмотрение. Вот так изначально выглядит crontab-файл:

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

Чтобы изменить crontab-файл другого пользователя (например, ostechnix):

Ниже приведены несколько примеров cron-заданий:

  1. Чтобы выполнять команду каждую минуту, задание должно быть такое:
  2. Похожее задание, только команда будет вызываться каждые пять минут:
  3. Вызывать команду 4 раза в час (каждые 15 минут):
  4. Чтобы выполнить команду каждый час в 30 минут, пишем:

    Т. е. команда будет выполняться не каждые 30 минут, а тогда, когда значение минут будет равно 30 (например, 10:30, 11:30, 12:30 и т. д.).

  5. Значения времени можно комбинировать, перечислив их через запятую. Следующий код будет выполнять команду три раза в час: в 0, 5 и 10 минут.
  6. Выполнять команду каждый час будет следующее задание:
  7. Выполнение команды каждые два часа:
  8. Чтобы выполнять команду каждый день (в 00:00):
  9. Выполнение команды каждый день в 03:00:
  10. Выполнение команды каждое воскресенье (sunday):
  11. Другой вариант задания, которое будет выполнять команду каждое воскресенье (естественно, тоже в 00:00):
  12. Выполнение команды каждый день с понедельника по пятницу:
  13. Следующее задание будет выполнять команду каждый месяц, 1-го числа в 00:00:
  14. Выполнять команду в 16:15 каждого первого числа месяца будет это задание:
  15. Выполнение команды каждые три месяца:
  16. Выполнение команды в строго определённое время и месяц:
  17. Задание будет вызывать команду в начале каждого полугодия (в 00:00 1-го дня):
  18. Выполнение команды каждый год 1-го января в 00:00:

Ещё существуют готовые задания:

  • — одиночное выполнение команды при загрузке;
  • — раз в год;
  • — тоже раз в год;
  • — раз в месяц;
  • — один раз в неделю;
  • —  раз в день;
  • — тоже раз в день;
  • — раз в час.

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

Команда для очистки всех заданий текущего пользователя:

Чтобы узнать о подробностях, есть команда:

Вышеперечисленного уже должно хватить для базовой работы с Cron и составления заданий.

Варианты команд для планировщика

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

 wget -O /dev/null -q http://ваш-домен.ru/cron.php
 curl -s http://ваш-домен.ru/cron.php > /dev/null

Следующие команды с использованием консольного PHP, следовательно путь должен быть указан согласно системного расположению файла :

 php -f /полный_путь_до_tds/cron.php
 php-cli /полный_путь_до_tds/cron.php > /dev/null

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

Cron Expression

Let’s understand the cron expression; it consists of six fields:

From these, <year> field is optional.

3.1. Specials Characters in Expression

  • * (all) – it is used to specify that event should happen for every time unit. For example, “*” in the <minute> field – means “for every minute”
  • ? (any) – it is utilized in the <day-of-month> and <day-of -week> fields to denote the arbitrary value – neglect the field value. For example, if we want to fire a script at “5th of every month” irrespective of what the day of the week falls on that date, then we specify a “?” in the <day-of-week> field
  • – (range) – it is used to determine the value range. For example, “10-11” in <hour> field means “10th and 11th hours”
  • , (values) – it is used to specify multiple values. For example, “MON, WED, FRI” in <day-of-week> field means on the days “Monday, Wednesday, and Friday”
  • / (increments) – it is used to specify the incremental values. For example, a “5/15” in the <minute> field, means at “5, 20, 35 and 50 minutes of an hour”
  • L (last) – it has different meanings when used in various fields. For example, if it’s applied in the <day-of-month> field, then it means last day of the month, i.e. “31st for January” and so on as per the calendar month. It can be used with an offset value, like “L-3“, which denotes the “third to last day of the calendar month”. In the <day-of-week>, it specifies the “last day of a week”. It can also be used with another value in <day-of-week>, like “6L“, which denotes the “last Friday”
  • W (weekday) – it is used to specify the weekday (Monday to Friday) nearest to a given day of the month. For example, if we specify “10W” in the <day-of-month> field, then it means the “weekday near to 10th of that month”. So if “10th” is a Saturday, then the job will be triggered on “9th”, and if “10th” is a Sunday, then it will trigger on “11th”. If you specify “1W” in the <day-of-month> and if “1st” is Saturday, then the job will be triggered on “3rd” which is Monday, and it will not jump back to the previous month
  • # – it is used to specify the “N-th” occurrence of a weekday of the month, for example, “3rd Friday of the month” can be indicated as “6#3“

3.2. Cron Expression Examples

Let us see some examples of cron expression by using the fields and specials characters combinations:

At 12:00 pm (noon) every day during the year 2017:

Every 5 minutes starting at 1 pm and ending on 1:55 pm and then starting at 6 pm and ending at 6:55 pm, every day:

Every minute starting at 1 pm and ending on 1:05 pm, every day:

At 1:15 pm and 1:45 pm every Tuesday in the month of June:

At 9:30 am every Monday, Tuesday, Wednesday, Thursday, and Friday:

At 9:30 am on 15th day of every month:

At 6 pm on the last day of every month:

At 6 pm on the 3rd to last day of every month:

At 10:30 am on the last Thursday of every month:

At 6 pm on the last Friday of every month during the years 2015, 2016 and 2017:

At 10 am on the third Monday of every month:

At 12 am midnight on every day for five days starting on the 10th day of the month:

Examples

The entry:

01 * * * * /bin/echo Hello, world!

runs the command on the first minute of every hour of every day of every month (i.e. at 12:01, 1:01, 2:01, etc.).

Similarly:

*/5 * * jan mon-fri /bin/echo Hello, world!

runs the same job every five minutes on weekdays during the month of January (i.e. at 12:00, 12:05, 12:10, etc.).

The line (as noted in «man 5 crontab»):

*0,*5 9-16 * 1-5,9-12 1-5 /home/user/bin/i_love_cron.sh

will execute the script at five minute intervals from 9 AM to 5 PM (excluding 5 PM itself) every weekday (Mon-Fri) of every month except during the summer (June, July, and August).

Periodical settings can also be entered as in this crontab template:

# Chronological table of program loadings                                       
# Edit with "crontab" for proper functionality, "man 5 crontab" for formatting
# User: johndoe

# mm  hh  DD  MM  W /path/progam ...  ( W = weekday: 0-6  )
  21  01  *   *   * /usr/bin/systemctl hibernate
  @weekly           $HOME/.local/bin/trash-empty

Here are some self-explanatory crontab syntax examples:

30 4 echo "It is now 4:30 am."
0 22 echo "It is now 10 pm."
30 15 25 12 echo "It is 3:30pm on Christmas Day."
30 3 * * * echo "Remind me that it's 3:30am every day."
0 * * * * echo "It is the start of a new hour."
0 6 1,15 * * echo "At 6am on the 1st and 15th of every month."
0 6 * * 2,3,5 echo "At 6am on Tuesday, Wednesday and Thursdays."
59 23 * * 1-5 echo "Just before midnight on weekdays."
0 */2 * * * echo "Every two hours."
0 20 * * 4 echo "8pm on a Thursday."
0 20 * * Thu echo "8pm on a Thursday."
*/15 9-17 * * 2-5 echo "Every 15 minutes from 9am-5pm on weekdays."
@yearly echo "Happy New Year!"

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

Код Системный crontab по умолчанию

*/15 * * * *     test -x /usr/sbin/run-crons && /usr/sbin/run-crons
0  *  * * *      rm -f /var/spool/cron/lastrun/cron.hourly
0  3  * * *      rm -f /var/spool/cron/lastrun/cron.daily
15 4  * * 6      rm -f /var/spool/cron/lastrun/cron.weekly
30 5  1 * *      rm -f /var/spool/cron/lastrun/cron.monthly

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

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

ЗаметкаИ снова, полезно отметить, что vixie cron, cronie и bcron автоматически считывают содержимое файла /etc/crontab, в то время как dcron и fcron нет. Пожалуйста прочитайте раздел , чтобы изучить это подробнее.

Примечания

  1. Rhea // Реальный словарь классических древностей по Любкеру
  2. Щукарев А. Н. Рея, в мифологии // Энциклопедический словарь Брокгауза и Ефрона : в 86 т. (82 т. и 4 доп.). — СПб., 1890—1907.
  3. Кронос / Лосев А. Ф. // Мифы народов мира : Энцикл. в 2 т. / гл. ред. С. А. Токарев. — 2-е изд. — М. : Советская энциклопедия, 1988. — Т. 2 : К—Я. — С. 18.
  4. ↑ Кронос // Реальный словарь классических древностей / авт.-сост. Ф. Любкер ; Под редакцией членов Общества классической филологии и педагогики Ф. Гельбке, Л. Георгиевского, Ф. Зелинского, В. Канского, М. Куторги и П. Никитина. — СПб., 1885. — С. 392—393.
  5. Зайцев А. И. Греческая религия и мифология: курс лекций / Под ред. Л. Я. Жмудя. — М.: Academia, 2005. — С. 63. — 208 с. — (Classicus: Классическая учебная книга). — 5100 экз. — ISBN 5-7695-1681-X.
  6. Гесиод. Теогония. 154—185
  7. Павсаний. Описание Эллады VII 23, 4
  8. Каллимах, фр. 43 Пфайфер, ст. 70
  9. Ферекид, фр. В4 Дильс-Кранц = Тертуллиан. О венце 7
  10. Диодор Сицилийский. Историческая библиотека V 66, 4
  11. Гесиод. Теогония. стр. 497—500; Павсаний. Описание Эллады X 24, 6
  12. Гигин. Мифы 139
  13. Псевдо-Аполлодор. Мифологическая библиотека I 1, 3-5; 2, 1 далее; Нонн. Деяния Диониса XXIV стр. 228
  14. Павсаний. Описание Эллады V 7, 10; VIII 2, 2
  15. Орфика, фр. 154 Керн = Порфирий. О пещере нимф 16
  16. Первый Ватиканский мифограф II 4, 1
  17. Климент. Протрептик 30, 3
  18. Нонн. Деяния Диониса XL 403
  19. Плутарх. О суеверии 13
  20. Павсаний. Описание Эллады V 7, 6
  21. Павсаний. Описание Эллады VI 20, 1
  22. Полемон, фр. 102 Преллер

Какой cron наиболее подходит?

vixie cron

Vixie cron — это полноценная реализация программы cron, основанная на SysV cron. Каждый пользователь имеет свой собственный файл заданий crontab, и ему разрешается указывать переменные среды внутри этого файла. В отличие от других видов cron, он также предлагает поддержку SELinux и PAM. Он поддерживает меньшее количество архитектур чем Dcron, но большее по сравнению с Fcron. Последняя версия 4.1 от января 2004.

  • Поддержка SELinux;
  • Поддержка PAM (/etc/security/limits.conf);
  • Установка переменных среды в файлах заданий crontabs (PATH, SHELL, HOME, etc.);
  • У каждого пользователя может быть личный файл заданий crontab; доступ контролируется файлами cron.allow и cron.deny

dcron (Dillon’s Cron)

  • Быстрый, простой и свободный от излишних функций;
  • Доступ к файлу crontab ограничен группой cron, т.е. он не полагается на внешние средства.

fcron

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

bcron

  • Легкая замена vixie-cron;
  • Ориентированность на множество процессов;
  • Нативная поддержка перехода на летнее время.

anacron

Anacron — это не демон cron, это то, что работает в объединении с ним. Он выполняет команды по интервалам в указанные дни и не предполагает непрерывную работу системы; он запускает работы, которые были пропущены, пока система была отключена. Anacron обычно полагается на демон cron, чтобы запускаться каждый день.

Примечания к работе с cron

1. При запуске скрипта из консоли вы можете указать одну из доступных версий php (5.3, 5.4, 5.6, 7.1, 7.2, а также 7.3 и 7.4 на серверах с номерами от vh238), прописав путь до интерпретатора следующим образом: , где XX — нужная версия.

Например, чтобы запустить скрипт script.php из-под версии PHP 7.1, необходимо указать:

/opt/php71/bin/php /home/u/user/папка_сайта/public_html/script.php

(u и user — первая буква логина и сам логин). 

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

3. Если в задаче запускается скрипт, требующий переменные веб-сервера, запуск напрямую через PHP-интерпретатор приводит к ошибкам. Поэтому в случае, когда вы используете скрипт, работающий при запуске через адресную строку браузера, необходимо выбирать тип файла «HTTP-запрос» и указывать URL для запроса аналогично тому, как он указывается в адресной строке, например:

Со стороны специалистов поддержки Timeweb не оказываются консультации по исправлению кода скриптов для задач cron.

Dcron

The cron daemon parses a configuration file known as . Each user on the system can maintain a separate crontab file to schedule commands individually. The root user’s crontab is used to schedule system-wide tasks (though users may opt to use or the directory, depending on which cron implementation they choose).

/var/spool/cron/root
# Run command at a scheduled time
# Edit this 'crontab -e' for error checking, man 1 crontab for acceptable format

# <@freq>                       <tags and command>
@hourly         ID=sys-hourly   /usr/sbin/run-cron /etc/cron.hourly
@daily          ID=sys-daily    /usr/sbin/run-cron /etc/cron.daily
@weekly         ID=sys-weekly   /usr/sbin/run-cron /etc/cron.weekly
@monthly        ID=sys-monthly  /usr/sbin/run-cron /etc/cron.monthly

# mm  hh  DD  MM  W /path/command (or tags) # W = week: 0-6, Sun=0
  21  01  *   *   * /usr/bin/systemctl suspend

These lines exemplify one of the formats that crontab entries can have, namely whitespace-separated fields specifying:

  1. @period
  2. ID=jobname (this tag is specific to dcron)
  3. command

The other standard format for crontab entries is:

  1. minute
  2. hour
  3. day
  4. month
  5. day of week
  6. command

The crontab files themselves are usually stored as . For example, root’s crontab is found at

See the crontab man page for further information and configuration examples.

Crontab Examples

A line in crontab file like below removes the tmp files from /home/someuser/tmp each day at 6:30 PM.

30     18     *     *     *         rm /home/someuser/tmp/*

Crontab every hour

This is most commonly used for running cron every hour and executing a command after an interval of one hour.

crontab format every hour is simple to have hour field as *  which runs every hour as the clock switches to new hour.  if you want to run it at the beginning of hour the minute filed needs to be 0 or any other minutes when you want to run it at a specific minute of the hour. 

cron every hour to run at the beginning of the hour.00     *     *     *     *         rm /home/someuser/tmp/*

cron every hour to run at 15 minute of an hour..

15     *     *     *     *         rm /home/someuser/tmp/*

cron every minute

To run cron every minute keep the minutes field as * , as minute changes to new minute cron will be executed every minute.  if you want to run it continuously every hour then the hour field also needs to have value of  * .

*     *     *     *     *         rm /home/someuser/tmp/*

if you want to run a script every minute at specific hour, change the value of hour field to specific value such as 11th hour.

*     11     *     *     *         rm /home/someuser/tmp/*

More crontab examples

Changing the parameter values as below will cause this command to run at different time schedule below :

min hour day/month month day/week Execution time
30 1 1,6,12 * — 00:30 Hrs  on 1st of Jan, June & Dec.
20 * 10 1-5 –8.00 PM every weekday (Mon-Fri) only in Oct.
1,10,15 * * — midnight on 1st ,10th & 15th of month
5,10 10 * 1 — At 12.05,12.10 every Monday & on 10th of every month

Note : If you inadvertently enter the crontab command with no argument(s), do not attempt to get out with Control-d. This removes all entries in your crontab file. Instead, exit with Control-c.

Crontab: добавление задания в планировщик cron

Для добавления задач в cron можно использовать команду:

Данная команда откроет файл для задач для вашего пользователя в текстовом редакторе по-умолчанию (у меня это vi, но можно изменить на удобный для вас, например nano). Настройка заданий таким способом исключает, что вы допустите ошибку в синтаксисе. Редактор crontab просто не даст сохранить файл с ошибками.

Также можно отредактировать файл заданий cron вручную через mc:

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

Чтобы добавить простое задание по запуск bash скрипта в cron, выполните:

Теперь добавьте расписание задания и путь к файлу скрипта:

 * * * * * /root/test.sh

Сохраните файл (редактирование файла по аналогии с редактором vim: сохранить Ctrl+O и выйти Ctrl+x).

Если все сделали верно, ваше задание будет добавлено. Чтобы вывести список заданий cron, выполните:

* * * * * /root/test.sh

Или так:

Данный скрипт будет запускаться через cron ежеминутно.

Минимальное время – 1 минута. Демон cron просматривает список заданий один раз в минуту. Просматриваются следующие файлы и каталог:

/etc/crontab
/etc/cron.*/.
/var/spool/cron/

Каждая запись расписания crontab состоит из 5 полей:

минуты часы день_месяца месяцы день_недели
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

Можно использовать следующие допустимые значения для каждого из полей:

Поле Диапазон значений
минуты
часы
день месяца
месяц или
день недели (где 0 это воскресение) или

Знак * означает все допустимые значения. Пример задания:

15 00 * * 1 /root/test.sh

Указанный в задании скрипт, будет запускаться каждый понедельник в 00 часов 15 минут. Для упрощения синтаксиса cron-файла используют специальные символы:

Запятая (,) : запятой разбиваются значения расписания для выполнения одинаковой задачи, но в разное время. Например, если вам нужно выполнять задачу в 15 и 30 минут, вы можете задать расписание так:

15 * * * *
30 * * * *

Или исползовать более короткий синтаксис с запятой:

15,30 * * * *

Слеш (/) : использовать косую черту можно для выражения какого-либо шага. Например, вам нужно запускать какую-то задачу каждые 2 часа. В обычном написании файл cron будет громоздким, используя / вы заметно сократите содержимое cron файл:

Дефис (-) : дефис указывает диапазон значений в поле. Если вы хотите запускать задание первые 10 минут или последние 10 минут, укажите диапазон через дефис:

0-10 * * * *
50-60 * * * *

Еще несколько примеров расписаний для cron:

  • запуск по будням в 12:00 и 18:00:
  • каждые 30 минут:
  • каждую субботу:
  • каждый вторник и четверг в 2:00 ночи:

Еще в cron можно использовать специальные переменные.

Переменная Описание Эквивалент
@reboot Запускается один раз при загрузке
@yearly

или

@annually

один раз в год
@monthly один раз в месяц
@weekly один раз в неделю
@daily один раз в день
@hourly ежечасно 0 * * * *
@midnight В полночь

Т.е. для запуска задания раз в день можно использовать формат:

Можно отредактировать cron файл другого пользователя:

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 .

Крон

Оскопление Урана Кроносом. Джорджо Вазари и Жерарди Христофано, XVI век, Палаццо Веккьо, Флоренция

Уран, боясь погибнуть от одного из своих детей-титанов, возвращал их снова в недра земли. Поэтому Гея, изнемогавшая от бремени, уговорила Кроноса, родившегося последним, оскопить Урана. Кронос стал верховным богом.

Серп, которым он оскопил Урана, Кронос бросил в море у мыса Дрепан (Серп) в Ахайе. Этот серп хранился в пещере в Занкле (Сицилия).

По Ферекиду Сирскому, Кронос победил Офиона и первым был коронован. По другой версии, Кронос был старшим сыном, и поэтому стал царём.

При нём наступил золотой век.

От союза Кроноса с нимфой Филирой (которую он после, опасаясь ревности богини Реи, превратил в кобылицу) родился кентавр Хирон.

Как проверить, работает ли крон на сайте?

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

Если крон работает, то запись просто опубликуется в заданное время. А если крон не работает, то мы увидим такую картину:

Крон может не работать по двум причинам:

  • Он отключен. Как отключать смотрите ниже.
  • Ваш сервер не умеет отправлять HTTP запросы. Крон активируется через неблокирующий HTTP запрос WP к самому себе.

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

define( 'ALTERNATE_WP_CRON', true );

Такой альтернативный запуск крона создаст запрос через , т.е. запрос будет отправлен не из PHP, а клиентом (браузером). Подробнее см. spawn_cron().

Настройка 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, передав ей в параметр нужную папку или даже сам скрипт:

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

cron

Планировщик задач в Linux играет незаменимую роль в автоматизации администрирования операционной системы. Роль планировщика задач выполняет демон cron (crond — в некоторых дистрибутивах). Демон cron обычно запускается . После запуска, демон cron ежеминутно просматривает свои таблицы, в которых содержатся информация о периодичности запуска команд и запускает команды, когда значения полей  минута,  час, месяц и хотя бы одно из полей число и день_недели, совпадают с текущим временем. Основной конфигурационный файл демона cron — /etc/crontab:

cron:~#cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

В /etc/crontab задания выполняются с помощью команды run-parts, которая запускает скрипты и программы из указанных каталогов (/etc/cron.hourly, /etc/cron.daily и т.д.). Каждая строка запускает из соответствующего каталога задания ежечасно, ежедневно, еженедельно и ежемесячно, соответственно строкам сверху вниз

Обратите внимание, что все команды здесь запущены от имени пользователя root. Заметьте также, что crontab может содержать присваивания значений переменным shell, которые будут установлены перед запуском команды

Так же, если необходимо запускать какие-то команды по особому расписанию (не ежечасно, ежедневно, еженедельно и ежемесячно), то таблицы заданий помещаются в каталог /etc/cron.d/.

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

/var/spool/cron — RedHat/var/spool/cron/crontabs — debian,ubuntu/var/spool/cron/tabs — SUSE

Каждая строка планировщика имеет следующий формат:

* * * * * {пользователь} выполняемая_команда
- - - - -
| | | | |
| | | | ----- День недели (0 - 7) (Воскресенье =0 или =7)
| | | ------- Месяц (1 - 12) (можно три буквы из названия месяца,
| | |                        регистр не имеет значения от jan до dec)
| | --------- День (1 - 31)
| ----------- Час (0 - 23)
------------- Минута (0 - 59)

В примере показан формат одной из строки таблицы, состоящий из 7 полей. Первые 5 полей  — это значения, задающие периодичность выполнения команды (расписание). 6-e поле присутствует только в таблицах /etc/crontab и др. расположенных в каталоге /etc/cron.d/. 7-е поле есть сама запускаемая команда. Командой может быть как простая команда, например, ls /proc >> /tmp/proc, или команда запуска написанного вами специального сценария. Со всей оставшаяся частью строки до символа перевода строки или символа %, будет выполнен вызов /bin/sh или другой оболочки, определенной в переменной SHELL в crontab. Знак процента (`%’ ) в команде (если он не экранирован обратной косой чертой (`\’ ) ) будет соответствовать символу перевода строки и все данные после первого `%’  будут посланы для команды на стандартный ввод.

Для указанных выше первых 5 полей, можно использовать звездочку (*), что означает все допустимые значения. Например, если поставить звёздочку в значении месяца, команда будет выполняться каждый месяц во время, указанное другими параметрами.

Дефис (-) между целыми числами обозначает диапазон чисел. Например, 1-4 означает целые числа 1, 2, 3 и 4.

Список значений, разделенных запятыми (,), обозначает перечень. Например, перечисление 3, 4, 6, 8 означает четыре указанных целых числа.

Косая черта (/) используется для определения шага значений. Если после диапазона указать /<целое_число>. Например, значение минут 0-59/2, определяет, что задание будет запущено каждую вторую минуту.

Вся оставшаяся часть строки до символа перевода строки или символа %, будет выполнен вызов /bin/sh или другой оболочки, определенной в переменной SHELL в crontab Знак процента (`%’ ) в команде (если он не экранирован обратной косой чертой (`\’ ) ) будет соответствовать символу перевода строки и все данные после первого `%’  будут посланы для команды на стандартный ввод.

Сохранение выходных данных Crontab

По-умолчанию cron сохраняет выходные /bin/execute/this/script.sh данные в почтовый ящик пользователя (в данном случае root). Но это красивее, если выход будет сохраняться в отдельном логе. Сделаем это так:

 */10 * * * * /home/myscript.sh >> /var/log/myscript.log 2>&1

Linux может создавать журналы на разных уровнях. Стандартный выход (STDOUT) и стандартные ошибки (STDERR). STDOUT помечается как 1, STDERR-как 2. Так что… следующая инструкция говорит Linux хранить STDERR в STDOUT, а также, создать один поток данных для сообщений и ошибок:

 2>&1

Теперь, когда у нас есть 1 выходной поток, мы можем вылить его в файл. Если знак больше один (>) файл будет перезаписываться, два знака больше (>>) данные всегда будут добавляться к файлу в конец. В нашем случае мы хотели бы добавлять данные:

 >> /var/log/script_output.log

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

Как было упомянуто ранее, anacron используется на системах, не предназначенных для непрерывной работы (подобно большинству настольных компьютеров). Его файл конфигурации по умолчанию, /etc/anacrontab, обычно выглядит так:

Файл

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# format: period delay job-identifier command
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

Главным различием между этим файлом crontab и другими является то, что у anacron-а нет фиксированной даты/часа для планирования работы, но только период между каждым запуском. Когда anacron запущен, он проверит содержимое набора файлов в /var/spool/anacron и вычислит, не истекла ли соответствующая запись в файле конфигурации с момента предыдущего запуска. Если это произошло, то команда вызывается снова.

В заключение, важно закомментировать какие-либо совпадающие записи в любом другом cron, установленном на системе, так, как в следующем примере с файлом crontab программы vixie-cron:

Файл

# для vixie-cron
# $Header: /var/cvsroot/gentoo-x86/sys-process/vixie-cron/files/crontab-3.0.1-r4,v 1.3 2011/09/20 15:13:51 idl0r Exp $
  
# Глобальные переменные
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
  
# проверять сценарии в cron.hourly, cron.daily, cron.weekly и cron.monthly
59  *  * * *    root    rm -f /var/spool/cron/lastrun/cron.hourly
#9  3  * * *    root    rm -f /var/spool/cron/lastrun/cron.daily
#19 4  * * 6    root    rm -f /var/spool/cron/lastrun/cron.weekly
#29 5  1 * *    root    rm -f /var/spool/cron/lastrun/cron.monthly
#*/10  *  * * * root    test -x /usr/sbin/run-crons && /usr/sbin/run-crons
@hourly         root    test ! -e /var/spool/cron/lastrun/cron.hourly && touch /var/spool/cron/lastrun/cron.hourly && run-parts --report /etc/cron.hourly

Без этого, части daily, weekly и monthly будут выполняться — в разное время — как демоном cron, так и anacron, приводя к возможным повторениям выполнения работ.

4: Управление выводом cron

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

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

Например, попробуйте добавить следующие строки в crontab. Среди них есть оператор MAILTO, за которым следует условный электронный адрес, директива SHELL, которая задает оболочку (в этом примере bash), директива HOME, указывающая путь, по которому следует искать двоичный файл cron, и одна задача cron:

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

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

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

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

Это задание cron также перенаправляет стандартную ошибку (представленную 2) на стандартный вывод (>&1). Поскольку стандартный вывод уже перенаправляется в /dev/null, скрипт будет работать без вывода сообщений. Даже если crontab содержит директиву MAILTO, выходные данные не будут отправляться на указанный адрес электронной почты.

Добавить комментарий

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