Я просто не могу понять, как работает определение 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 Я знаю, что все еще что-то неправильно понимаю, и я благодарен за объяснения.
Большое спасибо!
На оставшуюся часть вашего вопроса теперь должны быть даны ответы в следующих разделах Поваренной книги Upstart:
Теперь мы ясно (надеемся) задокументировали, как работа «rc» работает в Ubuntu в Upstart Cookbook. Он даже имеет свой собственный раздел:
http://upstart.ubuntu.com/cookbook/#the-rc-job
Однако, для полного контекста, Я предлагаю вам прочитать здесь:
http://upstart.ubuntu.com/cookbook/#really-understanding-start-on-and-stop-on
Порядок операций очень тщательно поддержан в выскочке при обработке событий. Остановки, вызванные событием, всегда делаются, прежде запускается. В то время как 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
Вы видели мой ответ на Чувство "остановиться на ..."? строфа, когда работа - это задача ? Тот же ответ относится к первой части вашего вопроса, он используется для отмены запуска уровня запуска, если пользователь переключается на другой уровень запуска до его завершения.
Я понятия не имею о второй части, хотя.