Европейский Университет в Санкт-Петербурге
Опубликован: 04.07.2008 | Доступ: свободный | Студентов: 1309 / 258 | Оценка: 4.34 / 3.65 | Длительность: 21:13:00
Лекция 9:

Управление процессами

Планирование запуска процессов

Вынесете ли вы сегодня мусор или пойдете в магазин, поедете на заправку кормить своего железного коня бензином или просто ляжете спать пораньше – так или иначе, какое-нибудь дело вы сегодня сделаете. Дела, которые вы делаете, могут быть однократными (купить щенка) или регулярными (погулять с собакой). Может быть, "однократные" – не совсем точное прилагательное, потому что щенка вы можете купить и раз, и два, и еще много раз в жизни. Но вряд ли это дело можно назвать регулярным – не станете же вы раз в год ровно в полночь 13 марта покупать щенка!

Все-таки станете? Вы не сатанист, часом?

Еще приятнее запланировать выполнение нерегуряного или регулярного дела так, чтобы его делал кто-то другой. Например, сообщите сыну, что вы просите его завтра в полдень отправиться в клуб собаководов и купить там щеночка. Однократно. А потом (когда купит) скажите, что вы запланировали его (сына) прогулки с ним (щеночком) ежедневно – на годы вперед.

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

at

Для планирования однократного запуска задач в строго определенное время (точность – одна минута) используется программа at. Она создает и изменяет список задач для выполнения, размещая его в каталоге /var/spool/cron/atjobs/. В Solaris это именно такой каталог, в других системах местоположение очереди задач может быть иным. Список задач ежеминутно инспектируется демоном cron, который отвечает за своевременный запуск задач. Во многих других системах UNIX демон cron не отвечает за задания, запланированные с помощью at, и для последних имеется специальный демон-запускатель atd.

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

at time date

Параметр time может быть в форме HH:MM (часы:минуты), или словом midnight, noon, now, или временем с суффиксом AM или PM в североамериканском формате. Дата должна быть либо в формате название_месяца день [год], либо MMDDYY, либо MM/DD/YY, либо DD.MM.YY. Также можно указать время в виде now+ n единицы, где единицы – это minutes, hours, days, weeks. Можно указать для времени суффикс today или tomorrow.

Указание time без date означает выполнение задачи в текущие сутки, а если time сегодня уже прошло, то завтра в указанное время.

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

at –l (или atq ) распечатывает список поставленных в очередь задач

at –r позволяет удалить задачу по идентификатору, который показывает at –l.

В некоторых системах at –r называется atrm. В Solaris приемлемы оба варианта.

Суперпользователь всегда может воспользоваться at.

Обычному пользователю разрешается использовать at в случае, если его имя указано в файле /usr/lib/cron/at.allow. Если этого файла нет, то проверяется, нет ли имени пользователя в /usr/lib/cron/at.deny (если есть, ему запрещается использование at ). Если ни одного из этих двух файлов нет, пользоваться at разрешается только пользователям, которым назначен набор полномочий1 solaris.jobs.user (по умолчанию – только пользователю root). Если есть только файл /usr/lib/cron/at.deny и он пуст, то по умолчанию всем разрешено пользоваться at. В файлах at.deny и at.allow имена пользователей пишутся по одному в строке.

Задания at и crontab заблокированного пользователя не запускаются. Демон cron запустит задания только того пользователя, который имеет легальный доступ в систему в настоящее время, как отражено в файле /etc/shadow.

Задание, запущенное на выполнение демоном cron, выполняется от имени пользователя, который поставил задание в очередь. Стандартный вывод и стандартный поток ошибок задания cron высылает почтой этому пользователю. Можно указать иное место для вывода информации с помощью ключа m команды at или с помощью параметра в файле crontab (см. ниже). Запланированные задачи выполняются в среде командного процессора /bin/sh без назначения управляющего терминала (т.е. вне терминальной группы, связанной с конкретным терминалом).

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

ls /var/spool/cron/atjobs/

Проверим время и дату.

date
Сбт 15 Май 2004 19:10:29

Запланируем создание файла в корневом каталоге через две минуты.

at 1912
at> touch /tuition
at> <Ctrl-D>
commands will be executed using /sbin/sh
job 1084633920.a at Сбт Май 15 19:12:00 2004

В каталоге, где собираются задания в очереди на выполнение, появился новый файл:

ls /var/spool/cron/atjobs/
1084633920.a

И по команде at –l мы получаем информацию о поставленном в очередь задании (указывается имя пользователя, инициировавшего задание, идентификатор задания, по которому его можно удалить, и время планируемого запуска).

at -l
user = root     1084633920.a    Сбт Май 15 19:12:00 2004

Пока в корневом каталоге файла tuition нет:

ls /
bin      devices     lib            opt         tmp        xfn
boot     etc         lost+found     platform    TT_DB
cdrom    export      mnt            proc        usr
core     home        net            sbin        var
dev      kernel      nsmail         test        vol

Почему? Да время еще не наступило:

date
Сбт 15 Май 2004 19:11:42

Дожидаемся заданного времени и (о чудо!) файл /tuition появился! Смотрите:

date
Сбт 15 Май 2004 19:12:12

ls /
bin       devices     lib           opt         tmp         vol
boot      etc         lost+found    platform    TT_DB       xfn
cdrom     export      mnt           proc        tuition
core      home        net           sbin        usr
dev       kernel      nsmail        test        var

cron

Демон cron ежеминутно инспектирует таблицу запланированных задач и выполняет те задачи, время которых наступило (в Solaris – не более 100 задач в минуту). Программа at нужна, как видно из раздела "at" выше, для планирования однократных задач, а программа crontab служит для планирования периодически запускаемых процессов. Они подготавливают таблицу заданий для cron.

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

Формат таблицы crontab: каждая строка описывает одну задачу, в строке содержится 6 полей:

mm    hh    dd    mo    dw    command
  • mm – минуты от 0 до 59
  • hh – часы от 0 до 23
  • dd – числа от 1 до 31
  • mo – месяцы от 1 до 12
  • dw – дни недели от 0 до 7, 0 и 7 – это воскресенье.
  • command – команда командному процессору, которую надо запустить (возможно, с аргументами).

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

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

Так, строка

12 10 * * 0 rm -rf /var/log/*.[0-9]

означает, что в 10:12 каждое воскресенье нужно удалять файлы *.[0-9] из /var/log.

Однако, если было бы написано

12 10 10 * 0 rm -rf /var/log/*.[0-9]

это бы требовало выполнять такое удаление "в 10:12 по воскресеньям и десятым числам", а не "в 10:12 десятого числа, если оно приходится на воскресенье".

Как и в случае с at, команда запускается от имени владельца таблицы, в качестве командного процессора используется /bin/sh.

В первых строках таблицы могут быть установлены переменные среды окружения. Наиболее полезна может оказаться переменная среды окружения PATH:

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

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

Кроме PATH можно установить переменные SHELL и HOME, а также MAILTO. По умолчанию HOME (домашний каталог) берется из /etc/passwd. Переменная LOGNAME устанавливается автоматически при запуске команды. Ей присваивается имя пользователя, от имени которого запускается команда. В BSD-системах она может называться USER, в Solaris есть обе переменные. LOGNAME и USER нельзя переопределить, HOME и SHELL – можно. Программа cron отправит сообщение владельцу таблицы crontab, если найдет повод это сделать (например, произошла ошибка выполнения команды). Если переменная MAILTO существует и ее значение отлично от пустой строки, то cron расценит это значение как имя адресата, которому надо послать письмо, вместо пользователя, запланировавшего задачу. Если переменная MAILTO есть и ее значение – пустая строка, то почта послана не будет. Установка любой переменной среды окружения в таблице crontab осуществляется так:

имя_переменной = значение

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

Для просмотра таблицы crontab используйте команду crontab -l, для удаления таблицыcrontab –r. Можно создать файл с таблицей crontab заранее и установить ее в систему командой

crontab имя_файла_таблицы.

Такая команда потенциально опасна: если раньше существовали какие-либо команды в таблице crontab, то они потеряются навсегда.

Регулярно выполняемые системные скрипты

В Solaris нет стандартно принятых по умолчанию регулярно выполняемых скриптов. Однако, рекомендуется их создать и расположить в каталоге /var/admin/cron/ или /etc/periodic/.

crontab -e
22 * * * * /var/admin/cron/hourly
22 22 * * * /var/admin/cron/daily
2 22 * * 0 /var/admin/cron/weekly
2 2 1 * * /var/admin/cron/monthly

В скрипт hourly рекомендуется включать проверку состояния сетевого подсоединения (ping), проверку и при необходимости установку прав доступа к почтовым ящикам пользователей, проверку состояния основных демонов (syslog, sendmail, named, sshd) с помощью ps, архивацию и обновление файлов протоколов (log rotation), которые достаточно выросли за час (рекомендуемый размер файла протокола для архивации – 1-2 мегабайта, но вы можете выбрать иное, исходя из удобства последую- щего анализа этого файла).

В скрипт daily включают проверку очереди сообщений (не слишком ли велика – запустите mailq ), синхронизацию системного времени ( ntpdate, rdate ).

В скрипт weekly включают проверку свободного места на диске (если у вас это приходится делать чаще, чем раз в неделю, подумайте о покупке нового диска; и может быть, лучше сразу купить парочку?), проверку файлов passwd, shadow, hosts.allow и hosts.deny, файлов конфигурации ftpd, sendmail, протоколов utmp и wtmp на предмет прав доступа и размера.

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

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

Александр Тагильцев
Александр Тагильцев

Где проводится профессиональная переподготовка "Системное администрирование Windows"? Что-то я не совсем понял как проводится обучение.

Александр Васильченко
Александр Васильченко
Россия
Денис Гайдуль
Денис Гайдуль
Россия, Подольск