cron и anacron

Конфигурирование crond

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

По-умолчанию демон crond запускается вместе с системой. Тем не менее статус можно проверить командой: 
systemctl status crond -l 

[root@server1 ~]# systemctl status crond -l
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-07-09 11:21:42 +10; 4 weeks 2 days ago
 Main PID: 1288 (crond)
    Tasks: 1
   CGroup: /system.slice/crond.service
           └─1288 /usr/sbin/crond -n

Jul 09 11:21:42 server1 systemd[1]: Started Command Scheduler.
Jul 09 11:21:42 server1 crond[1288]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 22% if used.)
Jul 09 11:21:45 server1 crond[1288]: (CRON) INFO (running with inotify support)

Временные интервалы cron

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

Таблица показывает используемые поля времени и даты (в указанном порядке).



Поле


Значение

 
 Минута



0 — 59


 Час



0 — 23

 
 День



1 — 31
 
 Месяц



1 — 12 (или имена месяцев)
 
 День недели



0 — 7 (или имена недели). Где, 0 или 7 — воскресенье

Если вместо значения указать *, то значение будет любым.

Примеры cron


 * 11 * * *

в любую минуту с 11 до 11:59

 0 11 * * 1-5

с 11 часов, каждые рабочие дни

 0 7-18 * * 1-5

каждый час в рабочие дни на 1 час

 0 */2 2 12 5

каждые 2 часа на час 2 декабря и каждую пятницу

Нет необходимости запоминать всё это. Достаточно посмотреть все возможные примеры в man 5 crontab.       

Конфигурационный файл cron 

Главный конфигурационный файл cron находится в /etc/crontab, но его НЕ надо редактировать. Вместо этого редактируйте:
  • cron-файлы в /etc/cron.d (сюда кидайте все задачи, которые должны выполняться от root);
  • Скрипты в /etc/cron.hourly, cron.daily, cron.weekly и cron.monthly;
  • Пользовательские скрипты, созданные с помощью crontab -e или если вы залогинились под root, то crontab -e -u имя_пользователя.
Когда скрипт будет создан и сохранён, он активируется автоматически.

Пример, как выглядит задача в каталоге /etc/cron.d
[root@server1 cron.d]# cat raid-check
# Run system wide raid-check once a week on Sunday at 1am by default
0 1 * * Sun root /usr/sbin/raid-check

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

Для начала, задания cron могут быть запущены для определенных пользователей. Чтобы создать пользовательское задание cron, введите crontab -e после входа в систему от имени этого пользователя или от имени root crontab -e -u username.

Когда вы используете crontab -e, редактор vi открывается и создает временный файл. После того, как вы отредактируете конфигурацию cron, временный файл будет перемещен в его окончательное местоположение в каталоге /var/spool/ cron. В этом каталоге файл создается для каждого пользователя. Эти файлы никогда не должны редактироваться напрямую! Когда файл сохраняется crontab -e, он активируется автоматически.

Если вы хотите добавить задания cron, которые не привязаны к конкретной учетной записи пользователя (и которые по этой причине по умолчанию будут выполняться как root, если не указано иное), добавляйте их в каталог /etc/cron.d. Просто поместите файл в этот каталог (точное имя не имеет значения) и убедитесь, что он соответствует синтаксису типичного задания cron. В листинге 1 вы можете увидеть пример файла конфигурации /etc/cron.d/unbound-anchor (который был вставлен в каталог /etc/cron.d после установки сервера DNS).

Листинг 1
[root@server1 cron.d]# cat unbound-anchor
# Look to see whether the DNSSEC Root key got rolled, if so check trust and update

10 3 1 * * unbound /usr/sbin/unbound-anchor -a /var/lib/unbound/root.
anchor -c /etc/unbound/icannbundle.pem

Этот пример файла содержит три элемента. Сначала указывается время, когда команда запускается в 3:10 утра первого числа каждого месяца. Затем конфигурация указывает, что команда должна быть запущена пользователем unbound. Последняя часть имеет фактическую команду, которую нужно запустить с некоторыми аргументами, специфичными для этой команды, и показать, как эту команду следует использовать.

Последний способ планирования заданий cron — через следующие каталоги:
  • /etc/cron.hourly
  • /etc/cron.daily
  • /etc/cron.weekly
  • /etc/cron.monthly
В этих каталогах вы обычно находите сценарии, которые помещаются туда из файлов пакета RPM. При открытии этих сценариев обратите внимание, что информация о времени выполнения команды не указана. Это потому, что точное время выполнения не имеет большого значения. Единственное, что имеет значение, это то, что задание запускается один раз в час, день, неделю или месяц.

Понимание цели anacron

Чтобы обеспечить регулярное выполнение задания, cron использует сервис anacron. Эта служба обеспечивает запуск ежечасных, ежедневных, еженедельных и ежемесячных заданий cron независимо от того, в какое точное время. Чтобы определить, как это сделать, anacron использует файл /etc/anacrontab. В листинге 2 показано содержимое файла /etc/anacrontab, который используется для указания того, как должны выполняться задания anacrontab.

Листинг 2
root@server1 spool]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron


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


SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days           delay in minutes         job-identifier           command
1                 5                cron.daily                    nice run-parts        /etc/cron.daily
7                25              cron.weekly                 nice run-parts        /etc/cron.weekly
@monthly 45              cron.monthly               nice run-parts        /etc/cron.monthly

В /etc/anacrontab выполняемые задания указываются в строках, содержащих три столбца, как показано в листинге 2. В первом столбце указывается частота выполнения задания, выраженная в днях. Во втором столбце указывается, как долго anacron ожидает выполнения задания, а в последней части указывается команда, которая должна быть выполнена.
Нелегко получить обзор всех заданий cron, фактически запланированных к выполнению. Нет единой команды, которая бы показывала все запланированные на данный момент задания cron. Команда crontab -l выводит список заданий cron, но только для текущей учетной записи пользователя.

Управление доступом к конфигурированию cron

По умолчанию все пользователи могут создавать задания cron. Можно ограничить пользователя, которому разрешено планировать задания cron, используя файлы конфигурации /etc/cron.allow и /etc/cron.deny. Если файл cron.allow существует, в нем должен быть указан пользователь, чтобы иметь возможность использовать cron. Если файл /etc/cron.deny существует, пользователь не должен быть указан в нем.

Пример настройки на выполнение запланированных задач через cron

1. Зайдите под root. Введите cat /etc/crontab, чтобы получить представление о содержимом файла конфигурации /etc/crontab.

2. Введите crontab -e. Это открывает интерфейс редактора, который по умолчанию использует vi в качестве редактора. Добавьте следующую строку:
0 2 * * 1-5 logger message from root

3. Введите команду :wq! закрыть сеанс редактирования и записать изменения.

4. Выполните cd /etc/cron.hourly. В этом каталоге создайте файл сценария с именем eachhour, который содержит следующую строку:
logger This message is written at $(date)

5. Выполните chmod +x eachhour, чтобы сделать скрипт исполняемым.

6. Теперь переключитесь на каталог /etc/crond.d и в этом каталоге создайте файл с именем eachhour. Скопируйте в файл следующее содержимое:
11 * * * * root logger This message is written from /etc/cron.d

7. Сохраните изменения в файле конфигурации и перейдите к следующему разделу. (Для достижения оптимального эффекта выполните последнюю часть этого примера через пару часов.)

8. Через пару часов введите grep wrote /var/log/messagesи прочитайте записанные сообщения, которые проверяют правильность работы cron.

Конфигурирование at

Принимая во внимание, что cron используется для планирования заданий, которые должны выполняться на регулярной основе, служба atd доступна для служб, которые должны выполняться только один раз. На RHEL 7/CentOS 7 служба atd доступна по умолчанию, поэтому все, что нужно сделать, — это планирование заданий.

Чтобы запустить задание через службу atd, вы должны использовать команду at, а затем время выполнения задания. Это может быть определенное время at 14:00, но это также может быть указание времени, например, at teatime или at noon. После того, как вы введете одну из этих команд, откроется оболочка at. Из этой оболочки вы можете ввести несколько команд, которые будут выполнены в указанное время. После ввода команд используйте Ctrl + D, чтобы выйти из оболочки.

После планирования заданий с помощью at вы можете использовать команду atq (q как очередь), чтобы получить обзор всех заданий, запланированных на данный момент. Также возможно убрать текущее задание. Для этого используйте команду atrm, за которой необязательно следует номер задания at, которое вы хотите удалить. В примере ниже вы узнаете, как работать с at, чтобы планировать выполнение заданий в определенное время.

Пример работы с at

1. Введите systemctl status atd. В строке, которая начинается с Loaded:, эта команда должна показать вам, что служба в данный момент загружена и включена, что означает, что она готова начать получать задания.

2. Введите at 15:00 (или замените на любое время, близкое ко времени, в которое вы работаете над этим примером).

3. Введите logger message from at. Используйте Ctrl+D, чтобы закрыть оболочку.

4. Введите atq, чтобы убедиться, что задание действительно запланировано.

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