5. Задание выполняет все, что необходимо сделать для состояния запуска.
6. Команда Upstart изменяет состояние задания со стартующего на предстартовое и порождает событие pre-start
7. Задание выполняется своим чередом и проходит еще через несколько состояний, пока не достигает работающего состояния.
8. Команда Upstart порождает событие started.
Завершение задания содержит похожий набор изменений состояния и событий. Обратитесь к странице руководства upstart-events(7), чтобы узнать подробности обо всех состояниях и переходах для обеих целей.
6.5.3. Конфигурация команды Upstart
Исследуем два файла конфигурации: один для задачи mountall, а другой — для сервиса tty1. Подобно другим файлам конфигурации, данные файлы расположены в каталоге /etc/init и называются mountall.conf и tty1.conf. Файлы конфигурации составлены из небольших фрагментов, которые называются
Для начала откройте на своем компьютере файл mountall.conf. Отыщите в первой строфе нечто подобное приведенной ниже строке:
description "Mount filesystems on boot"
Эта строфа дает краткое текстовое описание задания.
Далее вы увидите несколько строф, описывающих процесс запуска задания mountall:
start on startup
stop on starting rcS
Здесь первая строка говорит команде Upstart о запуске задания при возникновении события startup (это начальное событие, порождаемое командой Upstart). Вторая строка сообщает команде Upstart о том, что задание следует остановить при возникновении события rcS, когда система перейдет в режим одиночного пользователя.
Следующие строки говорят команде Upstart о том, как себя ведет задание mountall:
expect daemon
task
Строфа task говорит команде Upstart о том, что данное задание является задачей, и поэтому в какой-то момент должно быть завершено. Строфа expect чуть сложнее. Она означает, что задание mountall породит демон, который будет действовать независимо от исходного сценария задания. Команде Upstart необходимо знать о том, когда демон прекращает работу, чтобы дать правильный сигнал о завершении задания mountall. Более подробно мы рассмотрим это в пункте «Отслеживание процессов и строфа expect команды Upstart» далее.
Файл mountall.conf продолжается далее несколькими строфами emits, указывающими на события, которые порождает данное задание:
emits virtual-filesystems
emits local-filesystems
emits remote-filesystems
emits all-swaps
emits filesystem
emits mounting
emits mounted
примечание
Как отмечалось в подразделе 6.5.1, присутствующие здесь строки не сообщают о настоящих источниках событий. Чтобы их отыскать, вам придется тщательно просмотреть сценарий задания.
Вам может также встретиться строфа console, определяющая, куда должна направлять вывод команда Upstart:
console output
Если указан параметр output, команда Upstart отправляет вывод задания mountall в системную консоль.
Теперь вы увидите подробности самого задания — в данном случае это строфа script:
script
. /etc/default/rcS
[ -f /forcefsck ] force_fsck="—force-fsck"
[ "$FSCKFIX" = "yes" ] fsck_fix="-fsck-fix"
# set $LANG so that messages appearing in plymouth are translated
if [ -r /etc/default/locale ]; then
. /etc/default/locale
export LANG LANGUAGE LC_MESSAGES LC_ALL
fi
exec mountall —daemon $force_fsck $fsck_fix
end script
Это сценарий оболочки (см. главу 11), основная часть которого является подготовительной: происходит настройка языка сообщений, а также определяется необходимость использования утилиты fsck. Реальные действия происходят в команде exec mountall, в нижней части этого сценария. Эта команда монтирует файловые системы и порождает события по окончании данного задания.
Служба: tty1
Служба tty1 намного проще, она контролирует строку приглашения в виртуальной консоли. Полный файл конфигурации tty1.conf выглядит так:
start on stopped rc RUNLEVEL=[2345] and (
not-container or
container CONTAINER=lxc or
container CONTAINER=lxc-libvirt)
stop on runlevel [!2345]
respawn
exec /sbin/getty -8 38400 tty1
Самой сложной частью данного задания является момент его запуска, но пропустите пока строки, содержащие слово container, и сосредоточьтесь на следующем фрагменте:
start on stopped rc RUNLEVEL=[2345]
Эта часть сообщает команде Upstart, чтобы она активизировала данное задание после возникновения события stopped rc, когда отработает и будет завершена задача rc. Чтобы условие стало истинным, задание rc должно также установить для переменной окружения RUNLEVEL значение от 2 до 5 (см. подраздел 6.5.6).
примечание
Другие задания, которые работают с уровнями запуска, не столь требовательны. Вы можете встретить, например, такую запись: start on runlevel [2345]. Единственное существенное различие между двумя приведенными строфами start заключается в выборе момента времени; данный пример активизирует задание, как только будет установлен уровень запуска, а в предыдущем примере ожидается завершение всех процессов System V.