 | Планирование задач
Этот раздел охватывает материал по теме 1.111.4 экзамена 102 Администрирование Linux для начинающих (LPIC-1). Рейтинг темы 4.
Из этого раздела вы узнаете, как:
- Использовать команды
cron или
anacron для запуска задач через равные промежутки времени
- Использовать команду
at для запуска задач в определенное время
- Управлять задачами из cron и at
- Настроить доступ пользователя к сервисам cron и at
Из предыдущего раздела вы узнали о команде logrotate и увидели, что она должна запускаться через определенные промежутки времени. В следующих двух разделах, касающихся сервисов резервного копирования и сетевой службы времени, вы встретите в ту же необходимость регулярного запуска команд. Это только некоторые из множества задач администрирования, которые должны выполняться многократно и регулярно. Из этого раздела вы узнаете о средствах, используемых для автоматизации периодического планирования задач, а также о средствах, используемых для запуска задач в какое-то определенное время.
Запуск задач через равные промежутки времени
Запуском задач через равные промежутки времени управляет cron, состоящий из демона crond и набора таблиц, описывающих, какая работа должна быть выполнена и с какой периодичностью. Демон просыпается каждую минуту и проверяет crontab'ы, чтобы определить, что необходимо сделать. Пользователи управляют crontab'ами при помощи программы crontab. Демон crond обычно запускается процессом init в момент запуска системы.
Для простоты давайте предположим, что вы хотите регулярно запускать команду, показанную в листинге 28. Фактически эта команда только выдает сообщение о дате и времени, но она иллюстрирует приемы использования crontab для настройки заданий для cron, и из ее вывода узнаем, когда запускался cron. Для настройки записей в crontab необходима строка с escape-метасимволами shell, поэтому лучше сделать это при помощи простых команд и параметров, так что в этом примере команда echo будет запущена скриптом /home/ian/mycrontab.sh, которому не требуются параметры. Это избавит от необходимости использовать escape-символы.
Листинг 28. Пример несложной команды
[ian@lyrebird ~]$ cat mycrontest.sh
#!/bin/bash
echo "It is now $(date +%T) on $(date +%A)"
[ian@lyrebird ~]$ ./mycrontest.sh
It is now 18:37:42 on Friday
|
Создание crontab
Для создания crontab используется команда crontab с опцией -e ("edit"). Откроется редактор vi, если только вы не задали другой редактор в переменной окружения EDITOR или VISUAL.
Каждая запись в crontab состоит из шести полей:
- Минута
- Час
- День месяца
- Месяц года
- День недели
- Строка, которая должна быть запущена на исполнение при помощи
sh
Значения для минут и часов колеблются в диапазоне 0-59 и 0-12 соответственно, для дня месяца и месяца — в диапазоне 1-31 и 1-12 соответственно. День недели может обозначаться в диапазоне 0-6, причем 0 означает воскресенье. День недели также может быть задан как sun, mon, tue и т.д. Шестое поле, в которое входит все, что располагается после пятого поля, — строка, которая передается sh. Символ процента (%) используется для обозначения новой строки, поэтому если вы хотите использовать % или другой специальный символ, перед ним надо поставить обратный слеш (\). Строка до первого % передается shell''у, а все строки после % передаются на стандартный ввод.
Некоторые связанные со временем поля могут определяться отдельным значением, диапазоном значений, например, 0-10 или sun-wed, или разделенным запятыми списком отдельных значений и диапазонов. В листинге 29 показана в некоторой степени искусственно созданная запись в crontab для нашего примера.
Листинг 29. Несложный пример crontab
0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh
|
В этом примере наша команда исполняется каждую 0-ю, 20-ю и 40-ю минуту (каждые 20 минут) часа между 10 часами вечера и полуночью по пятницам и субботам в течение июля. Подробности о других способах определения времени см. в страницах руководства man для crontab(5).
Как насчет вывода?
Вы можете заинтересоваться, что происходит с выводом команды. Большинство команд, предназначенных для использования совместно с cron, записывают вывод в журнал при помощи функции syslog, о которой вы узнали из предыдущего раздела. Однако любой вывод, направленный на стандартный вывод, будет отправлен пользователю по почте. В листинге 30 показан вывод, который вы могли бы получить от команды из нашего примера.
Листинг 30. Вывод cron, отправленный по почте
From ian@lyrebird.raleigh.ibm.com Fri Jul 6 23:00:02 2007
Date: Fri, 6 Jul 2007 23:00:01 -0400
From: root@lyrebird.raleigh.ibm.com (Cron Daemon)
To: ian@lyrebird.raleigh.ibm.com
Subject: Cron <ian@lyrebird> /home/ian/mycrontest.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/ian>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=ian>
X-Cron-Env: <USER=ian>
It is now 23:00:01 on Friday
|
Где мой crontab?
Crontab, созданный вами при помощи команды crontab, хранится в /etc/spool/cron под именем пользователя, создавшего его. Так показанный выше crontab хранится в /etc/spool/cron/ian. Так что вы не удивитесь, узнав, что команда crontab, подобно рассмотренной ранее команде passwd, является suid-программой, которая запускается с полномочиями пользователя root.
/etc/crontab
Помимо пользовательских файлов crontab в /var/spool/cron, cron также проверяет /etc/crontab и файлы в каталоге /etc/cron.d. Эти системные crontab'ы имеют дополнительное поле между пятым полем для времени (день) и командой. Это дополнительное поле определяет пользователя, для которого будет запущена команда, обычно это root. /etc/crontab может выглядеть как в примере из листинга 31.
Листинг 31. /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
|
В этом примере реальная работа выполняется при помощи команды run-parts, которая запускает скрипты из /etc/cron.hourly, /etc/cron.daily и т.д.; /etc/crontab просто контролирует время выполнения повторяющихся заданий. Обратите внимание, что все команды здесь запущены от имени пользователя root. Заметьте также, что crontab может содержать присваивания значений переменным shell, которые будут установлены перед запуском команды.
Anacron
Функция cron хорошо работает в системах, работающих постоянно. В системах, которые могут быть отключены в течение долгого времени, например, в лэптопах, для управления планированием задач, обычно выполняемых ежедневно, еженедельно или ежемесячно, может использоваться команда anacron ("anachronistic cron", "анахроничный cron"). Anacron не используется для выполнения задач каждый час.
Anacron хранит метки времени файлов в /var/spool/anacron, чтобы записывать время выполнения заданий. При запуске anacron проверяет, прошло ли необходимое количество дней с тех пор, как задача была выполнена в последний раз, и при необходимости запускает ее. Таблица заданий для anacron хранится в /etc/anacrontab, формат которого немного отличается от формата /etc/crontab. Как и /etc/crontab, /etc/anacrontab может содержать настройки окружения. Каждое задание имеет четыре поля.
- период
- задержка
- идентификатор задачи
- команда
Период — число дней, но он может быть также определен как @monthly для гарантии, что задача будет выполняться только один раз в месяц независимо от числа дней в месяце. Задержка — число минут ожидания после того как задача должна быть запущена, но до того как она действительно начнет выполняться. Эта возможность может использоваться для предотвращения запуска слишком большого количества задач при первом старте системы. Идентификатор задачи может содержать любой отличный от пробела символ, за исключением слешей (/).
И /etc/crontab, и /etc/anacrontab обновляются путем непосредственного редактирования. Для обновления этих файлов или файлов в каталоге /etc/cron.d команда crontab не используется.
Запуск задач в определенное время
Иногда может быть необходимо запустить задание только один раз, а не делать это регулярно. Для этого используется команда at. Команды, которые должны быть запущены, берутся из файла, задаваемого при помощи опции -f, или со стандартного ввода, если опция -f не используется. Опция
-m посылает пользователю письмо, даже если команда не имеет стандартного вывода. Опция -v показывает, в какое время будет запущена задача. Время также показано в выводе. В листинге 32 показаны примеры запуска использовавшегося ранее скрипта mycrontest.sh. В листинге 33 показаны выводы, которые возвращаются пользователю после запуска задания. Обратите внимание, что вывод немного более компактен по сравнению с соответствующим выводом задачи cron.
Листинг 32. Использование команды at
[ian@lyrebird ~]$ at -f mycrontest.sh -v 10:25
Sat Jul 7 10:25:00 2007
job 5 at Sat Jul 7 10:25:00 2007
|
Листинг 33. Вывод задачи, запущенной at
From ian@lyrebird.raleigh.ibm.com Sat Jul 7 10:25:00 2007
Date: Sat, 7 Jul 2007 10:25:00 -0400
From: Ian Shields <ian@lyrebird.raleigh.ibm.com>
Subject: Output from your job 5
To: ian@lyrebird.raleigh.ibm.com
It is now 10:25:00 on Saturday
|
Спецификации времени могут быть довольно сложными. В листинге 34 показано несколько примеров. Ознакомьтесь со страницами руководства man для at, или с файлом /usr/share/doc/at/timespec, или с файлом /usr/share/doc/at-3.1.10/timespec, где 3.1.10 — версия пакета at.
Листинг 34. Варианты задания времени в команде at
[ian@lyrebird ~]$ at -f mycrontest.sh 10pm tomorrow
job 14 at Sun Jul 8 22:00:00 2007
[ian@lyrebird ~]$ at -f mycrontest.sh 2:00 tuesday
job 15 at Tue Jul 10 02:00:00 2007
[ian@lyrebird ~]$ at -f mycrontest.sh 2:00 july 11
job 16 at Wed Jul 11 02:00:00 2007
[ian@lyrebird ~]$ at -f mycrontest.sh 2:00 next week
job 17 at Sat Jul 14 02:00:00 2007
|
Команда at также имеет опцию
-q. Увеличение очереди увеличивает для задачи значение nice. Существует также команда batch, похожая на команду at, за исключением того, что она запускает задачи только при достаточно низкой системной нагрузке. Подробности об этих командах см. в страницах руководств man.
Управление запланированными задачами
Просмотр запланированных задач
Задачами cron и at можно управлять. Как показано в листинге 35, для просмотра crontab используется команда crontab
с опцией -l, для просмотра задач, поставленных в очередь командой at, используется команда atq.
Листинг 35. Просмотр запланированных задач
[ian@lyrebird ~]$ crontab -l
0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh
[ian@lyrebird ~]$ atq
16 Wed Jul 11 02:00:00 2007 a ian
17 Sat Jul 14 02:00:00 2007 a ian
14 Sun Jul 8 22:00:00 2007 a ian
15 Tue Jul 10 02:00:00 2007 a ian
|
Чтобы посмотреть, какая команда запланирована для исполнения при помощи at, используется команда at
с опцией -c и номером задания. Вы заметите, что большая часть окружения, которая была активна во время запуска команды at, сохранена для запланированного задания. В листинге 36 показана часть вывода для задания 15.
Листинг 36. Использование at -c в сочетании с номером задания
#!/bin/sh
# atrun uid=500 gid=500
# mail ian 0
umask 2
HOSTNAME=lyrebird.raleigh.ibm.com; export HOSTNAME
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
SSH_CLIENT=9.67.219.151\ 3210\ 22; export SSH_CLIENT
SSH_TTY=/dev/pts/5; export SSH_TTY
USER=ian; export USER
...
HOME=/home/ian; export HOME
LOGNAME=ian; export LOGNAME
...
cd /home/ian || {
echo 'Execution directory inaccessible' >&2
exit 1
}
${SHELL:-/bin/sh} << `(dd if=/dev/urandom count=200 bs=1 \
2>/dev/null|LC_ALL=C tr -d -c '[:alnum:]')`
#!/bin/bash
echo "It is now $(date +%T) on $(date +%A)"
|
Обратите внимание, что содержимое нашего скрипта было скопировано в виде встроенного документа, который будет выполнен shell'ом, установленным в переменной SHELL, или /bin/sh, если переменная SHELL не установлена. Чтобы узнать о встроенных документах, обратитесь к
Учебнику для экзамена LPI 101, Тема 103: Команды GNU и UNIX.
Удаление запланированных задач
Удалить запланированные задачи можно при помощи команды
cron с опцией -r, как показано в листинге 37.
Листинг 37. Просмотр и удаление заданий cron
[ian@lyrebird ~]$ crontab -l
0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh
[ian@lyrebird ~]$ crontab -r
[ian@lyrebird ~]$ crontab -l
no crontab for ian
|
Для удаления системных заданий cron или anacron отредактируйте /etc/crontab и /etc/anacrontab или отредактируйте или удалите файлы в каталоге /etc/cron.d.
При помощи команды atrm с указанием номера задания можно удалить одно или более заданий, запланированных при помощи команды at. Несколько заданий должны быть разделены пробелами. В листинге 38 показан пример.
Листинг 38. Просмотр и удаление заданий при помощи atq и atrm
[ian@lyrebird ~]$ atq
16 Wed Jul 11 02:00:00 2007 a ian
17 Sat Jul 14 02:00:00 2007 a ian
14 Sun Jul 8 22:00:00 2007 a ian
15 Tue Jul 10 02:00:00 2007 a ian
[ian@lyrebird ~]$ atrm 16 14 15
[ian@lyrebird ~]$ atq
17 Sat Jul 14 02:00:00 2007 a ian
|
Настройка доступа пользователя к планированию задач
Чтобы не только root, но и все другие пользователи имели возможность воспользоваться crontab и функцией cron, они должны быть перечислены в файле /etc/cron.allow, если он существует. Если файл /etc/cron.allow не существует, но существует файл /etc/cron.deny, пользователи, перечисленные в нем, не могут использовать crontab и функцию cron. Если ни один из этих файлов не существует, использовать эту команду может только суперпользователь. Если файл /etc/cron.deny пуст, это означает, что все пользователи могут использовать функцию cron. По умолчанию /etc/cron.deny пуст.
Для функции at подобный смысл имеют соответствующие файлы /etc/at.allow и /etc/at.deny.
|  |