Это были основы конфигурации команды Upstart. Подробности вы сможете найти на странице руководства init(5), а также в онлайн-источниках. Одной строфе следует уделить особое внимание. Это строфа expect, и о ней пойдет речь дальше.
Отслеживание процессов и строфа expect команды Upstart
Поскольку команда Upstart отслеживает процессы в заданиях, как только они запущены (чтобы она могла эффективно останавливать и перезапускать их), ей необходимо знать, какие процессы относятся к каждому из заданий. Эта задача может оказаться сложной, поскольку в традиционной схеме запуска системы Unix процессы ответвляются друг от друга, превращаясь в демоны, и основной процесс для какого-либо задания может начаться после одного-двух ветвлений. Без четкого отслеживания процессов команда Upstart будет неспособна завершить запуск задания или же неправильно определит идентификатор PID для задания.
Поведение задания сообщается команде Upstart с помощью строфы expect. Существует четыре основные возможности:
• отсутствие строфы expect — основной процесс задания не ветвится, следует отслеживать основной процесс;
• expect fork — процесс ветвится один раз, следует отслеживать ответвившийся процесс;
• expect daemon — процесс ветвится дважды, следует отслеживать второе ответвление;
• expect stop — основной процесс задания подаст сигнал SIGSTOP, чтобы сообщить о своей готовности. Такое бывает редко.
Для команды Upstart и для других современных вариантов команды init, таких как systemd, идеальным вариантом является первый (отсутствие строфы expect), поскольку основному процессу задания не приходится задействовать никаких собственных механизмов запуска и завершения. Другими словами, ему не приходится заботиться об ответвлении или откреплении себя от текущего терминала, с которыми разработчикам систем Unix приходится сталкиваться годами.
Во многие традиционные служебные демоны уже включены параметры стиля отладки, которые дают указание главному процессу, чтобы он не ветвился. В качестве примера можно привести демон защищенной оболочки sshd с параметром — D. Заглянув в строфы запуска в файле /etc/init/ssh.conf, можно обнаружить простую конфигурацию запуска демона sshd, которая предотвращает быстрое повторное ветвление и исключает ложный вывод в стандартную ошибку:
respawn
respawn limit 10 5
umask 022
# 'sshd — D' leaks stderr and confuses things in conjunction with 'console log'
console none
— snip—
exec /usr/sbin/sshd — D
Для заданий, которым необходимо наличие строфы expect, самым распространенным является вариант expect fork. Вот, например, пусковой фрагмент файла /etc/init/cron.conf:
expect fork
respawn
exec cron
Простой запуск задания, подобный вышеприведенному, обычно указывает на хорошо себя ведущий стабильный демон.
примечание
Стоит прочитать дополнительную информацию о строфе expect на сайте upstart.ubuntu.com, поскольку она напрямую относится к продолжительности действия процессов. Можно, например, отслеживать активность процесса и его системные вызовы, включая fork(), с помощью команды strace.
6.5.4. Управление командой Upstart
В дополнение к командам list и status, описанным в подразделе 6.5.2, можно также использовать команду initctl, чтобы управлять командой Upstart и ее заданиями. Вам потребуется прочитать страницу руководства initctl(8), но сейчас рассмотрим основы.
Чтобы запустить задание Upstart, используйте команду initctl start:
# initctl start
Чтобы остановить задание, применяйте команду initctl stop:
# initctl stop
Чтобы перезапустить задание:
# initctl restart
Если вам необходимо породить событие для команды Upstart, это можно выполнить вручную с помощью такой команды:
# initctl emit
Можно также добавить к порожденному событию переменные окружения, указав после события
примечание
Невозможно запускать и останавливать отдельные службы, запущенные в режиме совместимости команды Upstart со стандартом System V. Из подраздела 6.6.1 вы больше узнаете о том, как это выполняется в сценариях System V init.
Существует множество способов отключить задание Upstart, чтобы оно не стартовало при загрузке системы, однако самым управляемым является следующий: определите имя файла конфигурации задания (обычно это файл /etc/init/<
manual
После этого единственным способом запуска указанного задания станет применение команды initctl start
Основным преимуществом данного метода является его простая обратимость. Чтобы заново задействовать задание при загрузке системы, удалите файл. override.
6.5.5. Журналы команды Upstart