Как работает rc работа / порядок (противоречит) & ldquo; start on & hellip; & rdquo; и & ldquo; остановиться на & hellip; & rdquo; строфы

Я просто не могу понять, как работает определение rc Upstart в Natty 11.04. Чтобы проиллюстрировать проблему, вот определение (пустые строки и комментарии опущены):

start on runlevel [0123456]
stop on runlevel [!$RUNLEVEL]
export RUNLEVEL
export PREVLEVEL
console output
env INIT_VERBOSE
task
exec /etc/init.d/rc $RUNLEVEL

Давайте предположим, что мы в настоящее время находимся на уровне выполнения 2, и задание rc остановлено (это точно ситуация после загрузки мой ящик и вход в систему через SSH). Теперь давайте предположим, что система переключается на уровень запуска 3, например, из-за такой команды, как «telinit 3», заданной root. Что будет с заданием rc?

Очевидно, что задание rc будет запущено, так как оно в настоящее время остановлено, а уровень запуска события 3 соответствует стартовым событиям. Но отныне мне все неясно: согласно руководству $ RUNLEVEL оценивает новый уровень выполнения при запуске задания (в нашем примере это означает 3).

Поэтому следующая строфа «остановка на уровне выполнения [! $ RUNLEVEL]» переводится как «остановка на уровне выполнения [! 3]»; это означает, что у нас есть первая строфа, которая вызовет работу, но вторая строфа никогда не остановит работу и кажется бесполезной.

Поскольку я знаю, что люди из Ubuntu / Upstart не будут делать бесполезных вещей, я, должно быть, что-то неправильно понимаю. Буду благодарен за любое объяснение.

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

start on foo
stop on foo

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

Большое спасибо!


Редактирование вопроса в качестве реакции на первый ответ геокозавра:

Я вижу параллелизм, но это не так просто (по крайней мере, не для меня).

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

1) Задание является единичным экземпляром. Это означает, что «start on ...» не будет запущено, поскольку задание в данный момент выполняется; $ RUNLEVEL не трогается.

2) «stop on ...» будет срабатывать, поскольку новый уровень запуска отличается от $ RUNLEVEL, поэтому задание будет прервано.

3) Теперь работа остановлена ​​и ждет. Я не могу видеть, как он перезапускается с новым уровнем запуска. AFAIK, initctl генерирует события только один раз, поэтому «start on ...» не будет запущен и новый уровень выполнения не будет введен.

1118 Я знаю, что все еще что-то неправильно понимаю, и я благодарен за объяснения.

Большое спасибо!

3
задан 18 March 2011 в 02:38

4 ответа

На оставшуюся часть вашего вопроса теперь должны быть даны ответы в следующих разделах Поваренной книги Upstart:

0
ответ дан 18 March 2011 в 02:38

Теперь мы ясно (надеемся) задокументировали, как работа «rc» работает в Ubuntu в Upstart Cookbook. Он даже имеет свой собственный раздел:

http://upstart.ubuntu.com/cookbook/#the-rc-job

Однако, для полного контекста, Я предлагаю вам прочитать здесь:

http://upstart.ubuntu.com/cookbook/#really-understanding-start-on-and-stop-on

0
ответ дан 18 March 2011 в 02:38

Порядок операций очень тщательно поддержан в выскочке при обработке событий. Остановки, вызванные событием, всегда делаются, прежде запускается. В то время как Linux является мультипроцессом, механизм события выскочки не.

Так, команда runlevel, которая испускает 'runlevel' событие, получена новомодным механизмом состояния и затем обработана первым выполнением всех переходов от запуска для остановки полностью. Это заблокируется, пока первое дистанционное управление не уничтожается и мертво. Затем переходы от остановки для запуска сделаны, и новое емкостно-резистивное задание запускается.

Это на самом деле документируется в новомодный исходный код:

    /* We stop first so that if an event is listed both as a
     * stop and start event, it causes an active running process
     * to be killed, the stop script then the start script to be
     * run.  In any other state, it has no special effect.
     *
     * (The other way around would be just strange, it'd cause
     * a process's start and stop scripts to be run without the
     * actual process).
     */

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

https://bugs.launchpad.net/upstart-cookbook / + ошибка/745096

3
ответ дан 18 March 2011 в 02:38

Вы видели мой ответ на Чувство "остановиться на ..."? строфа, когда работа - это задача ? Тот же ответ относится к первой части вашего вопроса, он используется для отмены запуска уровня запуска, если пользователь переключается на другой уровень запуска до его завершения.

Я понятия не имею о второй части, хотя.

0
ответ дан 18 March 2011 в 02:38

Другие вопросы по тегам:

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