Использование cron и команды crontab

What to do when you get a list of all scheduled cron jobs on your system?

Now you know how to list the cron jobs on your Linux or Unix server or VM. Make sure you backup all cron jobs too. Typically I backup the following in directories:

  • /var/spool/cron/
  • /var/spool/anacron/
  • /etc/cron*

You learned how to list, display, and view all current Linux cron jobs. See the following tutorials for more info:

This entry is 5 of 16 in the Linux Cron Jobs Howto & Tutorial series. Keep reading the rest of the series:

  1. What is cron on a Linux or Unix-like systems?
  2. How To Add Jobs To cron Under Linux or UNIX?
  3. Verify crond Daemon And Cronjobs Are Running
  4. Start Restart and Stop The Cron or Crond Service
  5. List / Display All Cron Jobs
  6. Linux / UNIX Crontab File Location
  7. Change Crontab Email Settings ( MAILTO )
  8. Disable The Mail Alert By Crontab Command On a Linux or Unix-like Systems
  9. At What Time Cron Entries In cron.daily, cron.weekly, cron.monthly Run?
  10. Execute Cron Job After System Reboot
  11. Setup and Run PHP Script As A Cron Job
  12. Run crontab job every minute on a Linux or Unix-like system
  13. Running crontab (cron jobs) Every 10 Minutes
  14. Cron Job Script Execution on the Last Day of a Month
  15. Execute / Run crontab (cron jobs) every 1 minute
  16. Ubuntu create cron.log file

If you liked this page, please support my work on Patreon or with a donation.
Get the latest tutorials on SysAdmin, Linux/Unix, Open Source/DevOps topics:

  • RSS feed or Weekly email newsletter
Category List of Unix and Linux commands
File Management cat
Firewall Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04
Network Utilities dig • host • ip • nmap
OpenVPN CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04
Package Manager apk • apt
Processes Management bg • chroot • cron • disown • fg • jobs • killall • kill • pidof • pstree • pwdx • time
Searching grep • whereis • which
User Information groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w
WireGuard VPN Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04

Linux Crontab Syntax

Linux crontab has six fields. 1-5 fields defines the date and time of execution. The 6th fields are used for command or script to be executed.The Linux crontab syntax are as following:

  • Minute – A minute value can be between 0-59
  • Hour – A hour value can be between 0-23
  • Day_of_the_month – This value can between 1-31. For the months having less days will ignore remaining part
  • Month_of_the_year – This can be between 1-12. You can also define this value with first three alphebts of month like jan, feb, mar, apr etc.
  • Day_of_the_Week – This can be the value between 0-7. Where 0 and 7 for Sunday, 1 for Monday, 2 for Tuestday etc. You can also use first three alphabets of days like, sun, mon, tue, wed, etc.

Now, below statements will describe you to how to define multiple values or ranges. Read below and understand.

  • Astrics (*) – Matches anything
  • Multiple values – Use command (,) to define multiple values like 2,4,8 or sun,fri or jan,oct,dec etc.
  • Define range – You can define range using the hyphen like: 1-10 or 20-30 or sun-fri or feb-apr
  • Define multiple range – You can define multiple ranges with command separated like: jan-mar,jul-sep

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

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

View Root User Cronjob on Linux

Just type the following command as root user:

crontab -l

OR

sudo crontab -l

Sample outputs:

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
#  5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
#* * * * *	root /root/bin/master.replication
@reboot /bin/sleep 100;/bin/systemctl restart memcached

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

  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 и выполняет все ожидаемые задачи.

Extended syntax

Compared with POSIX crontab, Paul Vixie’s solution contains several very useful modifications to the syntax of the utility’s job table.

Now it’s possible to specify days of the week or months by their name (Mon, Tue etc.):

# Runs every minute on Mondays and Tuesdays in January* * * Jan Mon,Tue /path/to/exec

You can also specify the increment with which tasks run:

# Runs with a two minute increment*/2 * * * Mon,Tue /path/to/exec

Increments and intervals can be combined:

# Runs with an increment of two minutes for the first ten minutes of every hour0–10/2 * * * * /path/to/exec

And intuitive alternatives to ordinary syntax are supported (reboot, yearly, annually, monthly, weekly, daily, midnight, hourly):

# Runs after system reboot@reboot /exec/on/reboot# Runs once a day@daily /exec/daily# Runs once an hour@hourly /exec/daily

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

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

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

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

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

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

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

Для этого нужно установить с помощью :

Нажмите , а затем , чтобы подтвердить, что вы хотите установить .

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

Добавьте внизу файла следующую строку:

~/.bash_profile

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

Затем перезагрузите файл , чтобы оболочка смогла использовать обновленную версию:

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

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

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

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

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

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

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

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

Работа с планировщиком crontab

Доступнее и проще объяснить работу чего-либо ни с помощью «сухой» теории, а с помощью конкретных примеров.

Поэтому давайте, к примеру, добавим новое задание на ежедневную загрузку в 7 часов утра бесплатной (для домашнего использования) антивирусной программы Dr.Web CureIt! в директорию /home/AntiVirus.

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

Будем полагать, что такой пользователь создан (к примеру, drweb) и все права доступа на директорию, где будет в дальнейшем хранится антивирус, выставлены. Можно этого и не делать.

  1. Для того, чтобы добавить новое задание в crontab от имени drweb, необходимо выполнить команду:
    sudo crontab -e -u drweb

    Где ключ -e говорит о том, что файл открыт для редактирования (edit), а ключ -u позволяет указать от имени какого пользователя будет происходит выполнение задания (user).

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

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

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

    После этого уже непосредственно откроется текстовый файл.

  2. Первым делом следует убедиться, что в самом начале файла присутствуют строки:

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

    Возможно они не всегда нужны, но без них возможно придется писать полные пути к консольным командам. В Ubuntu 11.04 эти строки можно не вносить.

  3. Ниже следует добавлять задания.

    Общая форма записи задания выглядит так:

    где

    — это минуты для запуска (0-59);

    — это часы для запуска (0-23);

    — это день месяца для запуска (1-31);

    — это номер месяца в году для запуска (1-12);

    — это день недели для запуска (0-6), где 0 — воскресенье;

    — это непосредственно команда-действие, которое нужно совершить в указанное время.

    Несколько уточнений:

    • Одно задание — одна строчка в файле.
    • Между параметрами может быть как пробел, так и табуляция.
    • Если какой-то из этих параметров должен включать в себя все возможные значения или этот параметр в данный момент не важен, то должен использоваться символ * (звездочка).

      К примеру, если есть необходимость выполнить задание каждый раз, когда наступает 30 августа 12.20, то первые 5 параметров будут 20 12 30 8 *, если, к примеру, нужно выполнять задание каждую субботу в 00.00, то 5 первых параметров будут 0 0 * * 6

    • Если Вам необходимо указать диапазон времени запуска, то нужно использовать /period.

      К примеру, если необходимо запускать задание каждые 20-минут, то последние 5 параметров будут */20 * * * *, если каждый второй месяц в 00.00, то 0 0 * */2 *

    • Также диапазон можно обозначить и так 0 0 10-20 * *, т. е. задание будет выполняться каждый месяц с 10 по 20 число в 00.00
    • Если какой-то параметр имеет несколько значений, то значения можно перечислить через запятую.

      К примеру, запись 0 0 10,20 * * говорит о том, что задание будет выполняется 10 и 20 числа каждого месяца в 00.00

    • После добавления задания необходимо перевести курсор на новую строку, как бы дать понять cron`у, что это конец задания.

    В нашем случае c Dr.Web, необходимо добавить:
    0 7 * * * wget http://terrance.drweb.com/pub/drweb/cureit/setup.exe -O /home/AntiVirus/cureit.exe

    Если требуется совершить действие, которое не ограничивается выполнением одной команды, то необходимо создать файл (скрипт) и вызывать его исполнение в crontab.

    Для того, чтобы ваши задания взаимодействовали с графическим окружением нужно передать переменную DISPLAY. К примеру, если Вы хотите открывать каждый час музыкальный проигрыватель Rhythmbox, то строка задания должна быть:

    * */1 * * * export DISPLAY=:0; rhythmbox;

  4. Чтобы убедиться в том, что все данные были внесены верно, можно выполнить команду crontab с ключом -l (маленькая английская л), то есть:
    sudo crontab -l -u drweb

После сохранения изменений в файле, данные будут перенесены в конфигурационный файл /var/spool/cron/crontabs/drweb и будут ждать своего исполнения.

Syntax

crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]

Options

file Load the crontab data from the specified file. If file is a dash (««), the crontab data is read from standard input.
-u user Specifies the user whose crontab is to be viewed or modified. If this option is not given, crontab opens the crontab of the user who ran crontab. Note: using su to switch users can confuse crontab, so if you are running it inside of su, always use the -u option to avoid ambiguity.
-l Display the current crontab.
-r Remove the current crontab.
-e Edit the current crontab, using the editor specified in the environment variable VISUAL or EDITOR.
-i Same as -r, but gives the user a yes/no confirmation prompt before removing the crontab.
-s SELinux only: appends the current SELinux security context string as an MLS_LEVEL setting to the crontab file before editing or replacement occurs. See your SELinux documentation for detailed information.

Формат строк правил (задач)

Строки в таблице правил (задач) имеют следующий синтаксис:

<путь_к_файлу>  <маска_флагов_событий>  <команда>
  • &lt;путь_к_файлу&gt; — наилучшим вариантом будет указание полного пути к отслеживаемому файлу или каталогу. Если в записи пути встречаются пробелы, то перед каждым символом пробела должен быть указан символ «обратная косая черта » (\).
  • &lt;маска_флагов_событий&gt; — символьная или числовая маска, представляющая комбинацию отслеживаемых событий. При символьной записи маски флаги различных событий отделяются друг от друга запятыми.
  • &lt;команда&gt; — как и при использовании cron, командой может быть имя выполняемого файла (программы) или имя сценария, который следует выполнить при наступлении заданных маской событий.

Элементы строки отделяются друг от друга произвольным количеством пробелов или табуляций.

В маску могут быть включены флаги событий, перечисленных в таблице 1.

Таблица 1. Список событий, отслеживаемых incron.
Событие Назначение

IN_ACCESS

для отслеживания доступа к файлу (чтения из файла).

IN_MODIFY

для отслеживания изменения содержимого файла (записи в файл).

IN_ATTRIB

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

IN_CLOSE_WRITE

для отслеживания закрытия файла, ранее открытого для записи

IN_CLOSE_NOWRITE

для отслеживания закрытия файла, который был открыт без разрешения записи в него.

IN_OPEN

для отслеживания открытия файла.

IN_MOVED_FROM

для отслеживания перемещения файла из наблюдаемого каталога.

IN_MOVED_TO

для отслеживания перемещения файла в наблюдаемый каталог.

IN_CREATE

для отслеживания создания файла/подкаталога в наблюдаемом каталоге.

IN_DELETE

для отслеживания удаления файла/подкаталога в наблюдаемом каталоге.

IN_DELETE_SELF

для отслеживания удаления самого наблюдаемого каталога.

IN_CLOSE

для отслеживания закрытия файла без учёта дополнительных условий.

IN_MOVE

для отслеживания перемещения файла/каталога.

IN_ONESHOT

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

IN_ALL_EVENTS

определяет комбинацию всех возможных событий.

IN_ONLYDIR

для отслеживания событий, относящихся только к каталогам.

IN_MOVE_SELF

для отслеживания перемещения самого наблюдаемого каталога.

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

  incrontab -t
  incrontab --types

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

Как указывает автор, сам по себе демон incrond не защищён от проблемы бесконечного зацикливания. То есть, не исключена ситуация, когда некоторое событие инициализировало выполнение соответствующей команды, что опять приводит к наступлению этого же события и т.д. (например, для обработки события типа IN_ATTRIB применяется команда chmod.) Защиту от зацикливания при обработке событий должен взять на себя пользователь, записав в маску специальный флаг IN_NO_LOOP. При этом временно запрещается обработка всех событий для данного правила до тех пор, пока текущее событие не будет полностью обработано. После завершения обработки отслеживание заданных событий будет автоматически возобновлено. Недостатком такого подхода является потеря тех событий, которые были сгенерированы в интервале, когда обработка по данному правилу была запрещена.

В спецификацию команды для удобства могут быть включены следующие шаблоны:

  • $@ — путь в файловой системе, который был указан в таблице правил в элементе &lt;путь_к_файлу&gt;;
  • $# — имя файла, связанного с отслеживаемым событием;
  • $% — флаги событий, представленные в символьной форме;
  • $&amp; — числовое значение маски флагов;
  • $$ — для записи самого символа доллара.

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 )
#

Environment in which tasks are performed

Vixie cron allows you to change the environment in which the applications are run.

The environment variables USER, LOGNAME and HOME are not just provided by the daemon, but are taken from the passwd file. The PATH variable is given the “/usr/bin:/bin” value, and SHELL the value “/bin/sh”. The values of all the variables except from LOGNAME can be changed in the users’ tables.

Some environment variables (above all, SHELL and HOME) are used by cron itself to run a job. This is what it might look like if you use bash instead of the standard sh for running user jobs:

SHELL=/bin/bashHOME=/tmp/# exec will be run by bash in /tmp/* * * * * /path/to/exec

At the end of the day, all the environment variables defined in the table (either used by cron or necessary for the process) will be sent to the job which has been launched.

When editing the files using the crontab utility, the editor specified in the VISUAL or EDITOR environment variable is used. Should these variables not be defined in the environment in which crontab was launched, then (ucb denotes University of California, Berkeley) is used.

cron on Debian and Ubuntu

The developers of Debian and derivative distributions use a heavily modified version of Vixie cron 3.0pl1. There is no difference between the syntax of the table files; for users, it is the same Vixie cron. New capabilities: syslog, SELinux and PAM support.

A less obvious but tangible change is where the configuration files and job tables are located.

User tables on Debian are situated in the /var/spool/cron/crontabs directory, while the system table is in the same place, namely in /etc/crontab. Job tables specific to Debian packages are located at /etc/cron.d; this is where the cron daemon automatically reads them from. User access is regulated by the files /etc/cron.allow and /etc/cron.deny.

The default shell used remains /bin/sh. A small POSIX-compliant shell, dash, which runs without reading any configuration (in non-interactive mode), acts in this capacity on Debian.

Debian is run via systemd in the most recent versions of cron, while the run configuration may be viewed at /lib/systemd/system/cron.service. There is nothing special about the service configuration, any more finely tuned job management can be performed using environment variables declared directly in each of the users’ crontab.

cronie in RedHat, Fedora and CentOS

cronie is a fork of Vixie cron version 4.1. As is the case on Debian, the syntax is unchanged but support for PAM and SELinux, work in a clustered environment, file tracking using inotify and other capabilities, have been added.

The default configuration is located in the usual places: the system table at /etc/crontab, packages place their tables at /etc/cron.d and user tables fall into /var/spool/cron/crontabs.

The daemon is run under the control of systemd and the service configuration is /lib/systemd/system/crond.service.

When run in RedHat-based distributions the default is to use /bin/sh, which is a standard bash. When running cron jobs via /bin/sh, the bash shell is run in a POSIX-compliant mode and does not read any additional configuration, i.e. it works in a non-interactive mode.

cronie in SLES and openSUSE

The German distribution SLES, and its derivative openSUSE, use the same cronie as RedHat. The daemon here is also run under systemd and the service configuration is at /usr/lib/systemd/system/cron.service. Configuration: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. The same bash, run in a POSIX-compliant non-interactive mode, acts in the capacity of /bin/sh.

Design of Vixie cron

Today’s descendants of cron have not changed radically from Vixie cron, but they have acquired some new capabilities, although these are not required when it comes to understanding the principles of how the program works. Many of these extensions have been put together carelessly and the code is confusing. The original cron source code as written by Paul Vixie is a delight to read.

For this reason, I have opted to explore the code of cron based on the common ancestor of both branches of cron development, namely Vixie cron 3.0pl1. I will both simplify the examples, removing the ifdefs which make it more complicated to read and omit secondary details.

The work of the daemon can be split into several aspects:

  1. Initialisation of the program
  2. Collecting and updating the list of jobs to be run
  3. Cron’s main loop
  4. Executing a single cron job.

Let’s look at these one at the time.

Примеры использования incron

В некоторых системах документы для печати направляются не напрямую на принтер, а в специально организованный каталог заданий на печать, именуемый спулингом. Для отслеживания появления заданий в спулинге в incrontab можно написать простое правило:

/tmp/spool IN_CLOSE_WRITE /usr/local/bin/print_spool $@/$#

Теперь после завершения записи и закрытия файла в спулинге будет инициализирован сценарий, позволяющий выполнить печать заданного файла. Имя файла (с указанием полного пути к нему) передаётся в сценарий, как аргумент, при помощи ранее рассмотренных шаблонов.

Если суперпользователю root разрешено использовать incron, то можно организовать резервное копирование конфигурационных файлов с историей их изменения (т.е. каждый файл снабжается меткой времени). Для этого «от имени» суперпользователя root создаётся сценарий incron_bckp.sh (см. листинг 1), который размещается в каталоге /usr/local/sbin.

Листинг 1. Сценарий для резервного копирования измененных конфигурационных файлов
  #!/bin/sh
  mkdir -p /var/backup/incron
  # копирование изменённого файла
  cp -p --parents $1 /var/backup/incron
  # переименование скопированного файла для снабжения его меткой времени
  mv /var/backup/incron$1 /var/backup/incron$1_`date +%Y-%m-%d_%H-%M-%S`

Этот сценарий необходимо сделать выполняемым с помощью следующей команды:

chmod 755 /usr/local/sbin/incron_bckp.sh

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

incrontab -e

и добавить в нее следующие строки:

  /etc IN_CLOSE_WRITE,IN_MODIFY /usr/local/sbin/incron_bckp.sh $@/$#
  /usr/etc IN_CLOSE_WRITE,IN_MODIFY /usr/local/sbin/incron_bckp.sh $@/$#
  /usr/local/etc IN_CLOSE_WRITE,IN_MODIFY /usr/local/sbin/incron_bckp.sh $@/$#

После выполнения указанных действий изменения в системных конфигурационных файлах будут фиксироваться.

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

При этом операция защиты файла от изменений должна быть выполнена только один раз (после её завершения соответствующее правило incron теряет смысл). Для выполнения этой задачи можно создать следующую запись в incrontab:

/home/alex/.mail.local/warning.msg IN_CLOSE_WRITE,IN_ONESHOT chmod 440 $@

Cron basics

What cron does

Cron is a daemon that runs scheduled tasks based on input from the command crontab. It accomplishes this task by waking up every minute and checking to see if there are any cron-jobs to run in any of the user crontabs.

Note

  • Notice that crontab is both the name of a list of cron-jobs as well as the name of the command to edit that list.

The de facto cron

There are a few cron implementations to choose from in Portage. All of them offer a similar interface, namely the use of crontab or a similar command. There is also a related utility called Anacron which is meant to work with cron on systems that are not continuously running.

Before getting started working with cron, a proper cron implementation has to be selected.

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

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

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

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

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

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

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

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

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

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

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

Adblock
detector