Что именно означает «переключение уровня запуска»?

741
xiaq

Что происходит, когда я выпускаю sudo telinit n(n является новым уровнем запуска)? Есть ли initсканирование /etc/inittabи делает то же самое при загрузке системы? Например, если у меня есть

rm:2345:wait:/etc/rc.multi

в моем inittab, и я изменяю уровень запуска с 5 на 3. Выполняется ли /etc/rc.multiповторно или он пропущен?

1

1 ответ на вопрос

2
BigChief

Мое понимание изменения уровней выполнения состоит в том, что init«различает» старый и новый уровни выполнения и запускает / убивает службы, статус которых будет изменен.

В данном примере /etc/rc.multiне будет повторно выполнено, потому что это уже работает. Если у вас rm:45:wait:/etc/rc.multiв вашем /etc/inittab, и пошел с 5 -м уровне -> 3 -> 5, /etc/rc.multiбудет убит (-> 3), а затем начал (-> 5), так как он не установлен на 3 -й уровень.

Из справочной страницы :

Когда init запрашивается изменение уровня выполнения, он отправляет предупреждающий сигнал SIGTERM всем процессам, которые не определены в новом уровне выполнения. Затем он ждет 5 секунд, прежде чем принудительно завершить эти процессы с помощью сигнала SIGKILL.

/etc/inittab повторно проверяется, как вы описали:

После того, как он породил все указанные процессы, init ждет, пока один из его дочерних процессов не умрет, не получит сигнал сбоя питания или пока telinit не сообщит об этом, чтобы изменить уровень выполнения системы. Когда выполняется одно из трех указанных выше условий, он повторно проверяет файл / etc / inittab. Новые записи могут быть добавлены в этот файл в любое время. Однако init все еще ожидает выполнения одного из трех указанных выше условий.

На странице руководства сказано, что «он отправляет предупреждающий сигнал SIGTERM всем процессам, которые не определены на новом уровне выполнения». Как насчет потомков процесса (скажем, программы `/ bin / foo`), указанного в` inittab`? Я предполагаю, что `init` обрабатывает все дерево, порожденное` / bin / foo`, в целом, но man-страница сбивает с толку, и как мне доказать мою гипотезу? xiaq 13 лет назад 0
@xiaq: В нем говорится: «Обратите внимание, что init предполагает, что все эти процессы (и их потомки) остаются в той же группе процессов, которая изначально была создана для них init. Если какой-либо процесс изменит свою принадлежность к группе процессов, он не получит эти сигналы». Поэтому, пока группа процессов остается неизменной, она также должна их убивать. Чтобы проверить это, вы можете создать фиктивное приложение, которое разветвляется пару раз, добавить его в `inittab` и попробовать изменить уровень выполнения, чтобы увидеть, умирают ли дети. BigChief 13 лет назад 0
Извините, но что означает "группа процессов"? xiaq 13 лет назад 0
@xiaq: Как описано [здесь] (http://en.wikipedia.org/wiki/Process_group), группа процессов - это в основном способ распределения сигналов (таких как SIGTERM) сразу нескольким процессам. По умолчанию все дочерние процессы будут находиться в группе их родителей, и, следовательно, каскадное поведение при отправке SIGTERM / SIGKILL процессу верхнего уровня. В этом случае этот механизм - то, как init может раздавить все дочерние процессы службы без явного отслеживания их. BigChief 13 лет назад 0
+1 Вы могли бы рассмотреть перечисление значения `layman` уровней запуска - 1 - однопользовательский (` root`), 4 - `XOrg` и т. Д. new123456 13 лет назад 0
@ new123456 Извините, но что означает "непрофессионал"? (Я не являюсь носителем языка.) И кстати, 5 это XOrg. xiaq 13 лет назад 0
@xiaq - [определение] (http://dictionary.reference.com/browse/layman). Dictionary.com очень полезен для слов :) Кроме того, я могу сказать, что вы не используете Zenwalk - на Zenwalk 4 * - это * XOrg. new123456 13 лет назад 0
@ new123456: @xiaq не запрашивал определения уровня запуска, просто поведение переключения после запуска, поэтому я не вижу необходимости. И похоже, что он их уже знает. BigChief 13 лет назад 1
Кажется, мой первоначальный вопрос теперь полностью отвечен, поэтому я приму этот ответ. Тем не менее, я не совсем уверен относительно потока управления `init` относительно` inittab`, и мне нужно больше объяснений. Я открыл еще один вопрос [здесь] (http://superuser.com/questions/277309/control-flow-of-systemv-style-init). xiaq 13 лет назад 0

Похожие вопросы