<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF109%3ADRBruan3</id>
		<title>LXF109:DRBruan3 - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF109%3ADRBruan3"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF109:DRBruan3&amp;action=history"/>
		<updated>2026-05-13T03:53:24Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF109:DRBruan3&amp;diff=9046&amp;oldid=prev</id>
		<title>Crazy Rebel: /* Поэкспериментируем */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF109:DRBruan3&amp;diff=9046&amp;oldid=prev"/>
				<updated>2009-11-11T07:07:35Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Поэкспериментируем&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 07:07, 11 ноября 2009&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 73:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 73:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; tty5 (start) running, process 2123&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; tty5 (start) running, process 2123&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; tty6 (start) running, process 2127&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; tty6 (start) running, process 2127&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/del&gt;Вызовем событие &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;‘greet’ &lt;/del&gt;с помощью initctl таким образом:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вызовем событие &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;‘'''greet'''’ &lt;/ins&gt;с помощью &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;''&lt;/ins&gt;initctl&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;'' &lt;/ins&gt;таким образом:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; # initctl emit greet ellie&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; # initctl emit greet ellie&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; greet ellie&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; greet ellie&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF109:DRBruan3&amp;diff=9045&amp;oldid=prev</id>
		<title>Crazy Rebel: Новая: ==Юный выскочка==  : ''init'' малость устарел; пришло время нового демона запуска системы.  Много лет в Linux ис...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF109:DRBruan3&amp;diff=9045&amp;oldid=prev"/>
				<updated>2009-11-11T07:06:52Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: ==Юный выскочка==  : &amp;#039;&amp;#039;init&amp;#039;&amp;#039; малость устарел; пришло время нового демона запуска системы.  Много лет в Linux ис...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Юный выскочка==&lt;br /&gt;
&lt;br /&gt;
: ''init'' малость устарел; пришло время нового демона запуска системы.&lt;br /&gt;
&lt;br /&gt;
Много лет в Linux использовалась схема управления запуском сервисов во время загрузки, которая появилась в System V Unix еще в 1983 году. За эти годы системные администраторы подружились со структурой System V и уровнями выполнения. Они знают и о скриптах запуска сервисов в '''/etc/init.d''', и обо всех этих&lt;br /&gt;
символических ссылках с названиями на ‘'''S'''’ и ‘'''K'''’, и о процессе ''init'' с его&lt;br /&gt;
файлом конфигурации '''/etc/inittab'''.&lt;br /&gt;
&lt;br /&gt;
Поэтому исчезновение '''inittab''' в некоторых последних дистрибутивах Linux немного шокирует, как и замена почтенного ''init'' на ''upstart''.&lt;br /&gt;
Первым дистрибутивом, выполнившим ее, был Ubuntu (еще в Edgy Eft более полутора лет назад). В Fedora 9 также используется ''upstart'' (это позволяет предположить, что за ним со временем последует Red Hat&lt;br /&gt;
Enterprise Linux), а разработчики OpenSUSE 11.0 предпочли остаться со старым добрым ''init''.&lt;br /&gt;
&lt;br /&gt;
''Upstart'' – это основанная на событиях замена ''init''; управляет запуском задач и сервисов во время загрузки и их остановкой во время&lt;br /&gt;
выключения системы и наблюдает за ними во время работы. Демон ''upstart'', для обратной совместимости (и для вящей путаницы) названный ''init'', управляется «событиями», формируемыми '''D-BUS'''. У события&lt;br /&gt;
есть простое текстовое имя, например, ‘'''startup'''’, ‘'''control-alt-delete'''’ или ‘'''runlevel'''’.&lt;br /&gt;
&lt;br /&gt;
При запуске демон читает все файлы в '''/etc/event.d/'''. Каждый&lt;br /&gt;
из них определяет задание, которым будет управлять ''upstart''. Имя&lt;br /&gt;
задания совпадает с именем файла. Эти файлы устанавливают,&lt;br /&gt;
какие события вызовут запуск (или останов) задания и что делать,&lt;br /&gt;
когда происходит событие. Вот простой пример – файл события&lt;br /&gt;
'''Ctrl+Alt+Delete''' из Fedora 9 (обе его строки!):&lt;br /&gt;
&lt;br /&gt;
  start on control-alt-delete&lt;br /&gt;
  exec /sbin/shutdown -r now “Control-Alt-Delete pressed”&lt;br /&gt;
&lt;br /&gt;
Когда задание активизируется, оно проходит через серию состояний:&lt;br /&gt;
ожидание, запуск, выполнение, остановка и т.д. Эти изменения состояний сами порождают события: «запускается», «запущено», «останавливается» и «остановлен». Поэтому можно определить задание, запускаемое по окончании другого. Вот файл события prefdm – он отвечает за запуск графического экрана входа в систему сразу после перехода на&lt;br /&gt;
уровень выполнения '''5''' (т.е. после завершения задания ‘'''rc5'''’):&lt;br /&gt;
&lt;br /&gt;
  start on stopped rc5&lt;br /&gt;
  stop on runlevel [!5]&lt;br /&gt;
  console output&lt;br /&gt;
  respawn&lt;br /&gt;
  respawn limit 10 120&lt;br /&gt;
  exec /etc/X11/prefdm -nodaemon&lt;br /&gt;
&lt;br /&gt;
Директивы '''respawn''' в этом файле говорят, что ''upstart'' должен перезапустить программу после ее завершения, но не более 10 раз каждые&lt;br /&gt;
120 секунд. Механизм обработки событий ''upstart'' предоставляет большую гибкость в определении того, что должно произойти при выполнении заданных условий; можно, например, потребовать «смонтировать&lt;br /&gt;
USB-брелок, когда он обнаружен». Впрочем, ни в Ubuntu, ни в Fedora я не увидел подтверждения тому, что ''upstart'' настроен на такие штуки.&lt;br /&gt;
&lt;br /&gt;
''Upstart'' поставляется с утилитой ''initctl'', позволяющей получить список заданий, показать все сгенерированные события и переходы и даже вызвать собственные события вручную. Есть и утилита&lt;br /&gt;
''telinit'', предоставленная для обратной совместимости, хотя, насколько я могу судить, она просто вызывает событие подходящего уровня выполнения.&lt;br /&gt;
&lt;br /&gt;
===Поэкспериментируем===&lt;br /&gt;
&lt;br /&gt;
Понять, как работает ''upstart'', поможет простой эксперимент. (Я проводил его на Fedora 9, но все должно работать точно так же на Ubuntu.)&lt;br /&gt;
Начнем с создания файла '''sayhello''' в каталоге '''/etc/event.d''' с таким&lt;br /&gt;
содержимым:&lt;br /&gt;
&lt;br /&gt;
  start on greet&lt;br /&gt;
  console output&lt;br /&gt;
  script&lt;br /&gt;
  echo “hello $1” at $(date) &amp;gt; /tmp/upstart-test&lt;br /&gt;
  end script&lt;br /&gt;
&lt;br /&gt;
Затем просигнализируем ''upstart'' перечитать файлы событий. Как и&lt;br /&gt;
у старины ''init'', у демона ''upstart'' идентификатор процесса равен '''1''':&lt;br /&gt;
&lt;br /&gt;
  # kill -HUP 1&lt;br /&gt;
&lt;br /&gt;
Теперь проверим, что upstart знает о нашем задании, с помощью&lt;br /&gt;
команды:&lt;br /&gt;
&lt;br /&gt;
  # initctl list&lt;br /&gt;
  control-alt-delete (stop) waiting&lt;br /&gt;
  logd (stop) waiting&lt;br /&gt;
  prefdm (start) running, process 2119&lt;br /&gt;
  rc0 (stop) waiting&lt;br /&gt;
  ... кое-что опущено ...&lt;br /&gt;
  sayhello (stop) waiting&lt;br /&gt;
  ... опущено еще больше ...&lt;br /&gt;
  tty5 (start) running, process 2123&lt;br /&gt;
  tty6 (start) running, process 2127&lt;br /&gt;
      Вызовем событие ‘greet’ с помощью initctl таким образом:&lt;br /&gt;
  # initctl emit greet ellie&lt;br /&gt;
  greet ellie&lt;br /&gt;
  sayhello (start) waiting&lt;br /&gt;
  sayhello (start) starting&lt;br /&gt;
  sayhello (start) pre-start&lt;br /&gt;
  sayhello (start) spawned, process 9333&lt;br /&gt;
  sayhello (start) post-start, (main) process 9333&lt;br /&gt;
  sayhello (start) running, process 9333&lt;br /&gt;
  sayhello (stop) running&lt;br /&gt;
  sayhello (stop) stopping&lt;br /&gt;
  sayhello (stop) killed&lt;br /&gt;
  sayhello (stop) post-stop&lt;br /&gt;
  sayhello (stop) waiting&lt;br /&gt;
&lt;br /&gt;
Вывод команды ясно показывает изменения состояний, порождаемые нашим заданием ‘'''sayhello'''’. А проверка содержимого файла '''/tmp/upstart-test''' должна дать соответственно:&lt;br /&gt;
&lt;br /&gt;
  # cat /tmp/upstart-test&lt;br /&gt;
  hello ellie at Mon Jun 2 06:45:36 BST 2008&lt;br /&gt;
&lt;br /&gt;
Чтобы продвинуться на этап вперед, определим второе задание ‘'''saygoodbye'''’ в файле '''/etc/event.d'''. Оно будет запускаться после завершения ‘'''sayhello'''’:&lt;br /&gt;
&lt;br /&gt;
  start on stopped sayhello&lt;br /&gt;
  console output&lt;br /&gt;
  script&lt;br /&gt;
  echo “goodbye world” &amp;gt;&amp;gt; /tmp/upstart-test&lt;br /&gt;
  end script&lt;br /&gt;
&lt;br /&gt;
Конечно, будет нужно велеть ''upstart'' перечитать файлы. Теперь&lt;br /&gt;
откройте второе окно терминала. Выполните в нем следующую&lt;br /&gt;
команду:&lt;br /&gt;
&lt;br /&gt;
  # initctl events&lt;br /&gt;
&lt;br /&gt;
Она останется работать в фоне и сообщит обо всех событиях.&lt;br /&gt;
&lt;br /&gt;
Вернитесь в первое окно и сгенерируйте другое событие ‘greet’:&lt;br /&gt;
&lt;br /&gt;
  # initctl emit greet taylor&lt;br /&gt;
&lt;br /&gt;
потом вернитесь во второе, чтобы посмотреть, какие события были сгенерированы:&lt;br /&gt;
&lt;br /&gt;
  greet taylor&lt;br /&gt;
  starting sayhello&lt;br /&gt;
  started sayhello&lt;br /&gt;
  stopping sayhello ok&lt;br /&gt;
  stopped sayhello ok&lt;br /&gt;
  starting saygoodbye&lt;br /&gt;
  started saygoodbye&lt;br /&gt;
  stopping saygoodbye ok&lt;br /&gt;
  stopped saygoodbye ok&lt;br /&gt;
и в завершение эксперимента снова проверьте содержимое файла '''/tmp/upstart-test''', чтобы убедиться в том, что задание ‘'''saygoodbye'''’&lt;br /&gt;
запускалось:&lt;br /&gt;
&lt;br /&gt;
  # cat /tmp/upstart-test&lt;br /&gt;
  hello taylor at Mon Jun 2 07:01:45 BST 2008&lt;br /&gt;
  goodbye world&lt;br /&gt;
&lt;br /&gt;
Ну да, пример игрушечный. Но я надеюсь, что он помогает почувствовать, как работает механизм обработки событий ''upstart'', и показывает некоторые его возможности. Он мог бы заменить, например,&lt;br /&gt;
запуск задач по расписанию, который сейчас выполняется ''Cron''. Однако его главная цель на данный момент – просто заместить ''init'' как средство запуска сервисов во время загрузки. В самом upstart нет уровней&lt;br /&gt;
выполнения, но просмотрев файлы событий в '''/etc/event.d''', можно увидеть, что конфигурация эмулирует прежнее поведение. Все начинается с события ''startup'', активизирующего задание '''rcS''', которое выполняет традиционный низкоуровневый скрипт инициализации '''/etc/init.d/rcS''' (в Ubuntu) или '''/etc/rc.d/rc.sysinit''' (в Fedora). Что произойдет дальше, зависит от конкретного дистрибутива.&lt;br /&gt;
&lt;br /&gt;
===Потенциал===&lt;br /&gt;
&lt;br /&gt;
В Fedora 9 задание ''rcS'' запускает скрипт ‘''post-stop''’ – он вытаскивает уровень выполнения по умолчанию из '''/etc/inittab''' и вызывает ''telinit'' с этим уровнем выполнения как аргументом. Версия ''telinit'' в ''upstart'' нужна только для обратной совместимости, она просто генерирует событие&lt;br /&gt;
‘'''runlevel 3'''’, которое в свою очередь активизирует задание ''rc3'', запускающее традиционный скрипт ''/etc/rc.d/rc3'' для перехода на желаемый&lt;br /&gt;
уровень выполнения.&lt;br /&gt;
&lt;br /&gt;
Чтобы разобраться с Ubuntu, потребовалось чуть больше времени, но я в конце концов заметил файл '''rc-default''', запускаемый по завершению задания ''rcS'' (он содержит строку ‘'''start on stopped rcS'''’). Этот файл также пытается получить уровень выполнения по умолчанию из '''/etc/inittab''', а если такого файла нет (кстати, в установке по умолчанию его&lt;br /&gt;
и нет), то переходит на уровень выполнения 2 путем вызова ''telinit''. Но и в Ubuntu, и в Fedora все заканчивается вызовом обычного стартового сценария, который запускает скрипты '''S*''' из каталога с соответствующим уровнем выполнения. Другими словами, методы взаимодействия&lt;br /&gt;
с сервисами времени загрузки не изменились. (Например, для управления ссылками '''S*''' и''' K*''' все еще используется ''chkconfig''.) В обоих случаях&lt;br /&gt;
ссылка на ''/etc/inittab'' – это лишь мимолетный кивок в сторону обратной совместимости; в этом файле всего одна строка ‘'''initdefault'''’, она задает&lt;br /&gt;
начальный уровень выполнения. В самом ''upstart'' нет уровней выполнения, они лишь результат настройки ''upstart'', заботящейся об обратной&lt;br /&gt;
совместимости.&lt;br /&gt;
&lt;br /&gt;
Вообще-то в Ubuntu от идеи уровней выполнения почти отказались, так как их всего два: '''single-user''' и '''2'''. Кажется, мы возвращаемся ко&lt;br /&gt;
временам BSD Unix, где были только уровни выполнения '''single-user''' и '''multi-user''', и даже я смог понять, что происходит.&lt;br /&gt;
&lt;br /&gt;
Документация по ''upstart'' довольно скупа. В частности, в Ubuntu&lt;br /&gt;
даже нет раздела ''man'', где описывался бы формат файлов событий,&lt;br /&gt;
хотя такой раздел имеется в Fedora. Неплохое обсуждение есть в блоге&lt;br /&gt;
Скотта Джеймса Ремнанта [Scott James Remnant] (http://www.netsplit.com), но как-то странно искать документацию по фундаментальным вопросам в подобных местах. '''LXF'''&lt;br /&gt;
&lt;br /&gt;
===Не цитируйте меня…===&lt;br /&gt;
&lt;br /&gt;
Мой коллега, преподаватель по Linux, как-то спросил меня: «Чем различаются теория и практика?» Как, наверное, требует профессиональная этика в такие моменты, я ответил: «Не знаю, а чем?» «Ну, – сказал он, – в теории разницы нет, а на практике есть».&lt;br /&gt;
&lt;br /&gt;
Компьютерщики привыкли присваивать слова: ремешок ботинка (начальная загрузка – bootstrap), семафор, сигнал, молотить (thrash), мышь, печенье (cookie – куки), пламя (flame – флейм), мясные консервы (spam – спам), вилка (fork) и т.д. – и это напоминает мне наблюдение Шалтая-Болтая из «Алисы в Зазеркалье» Льюиса Кэрролла. Он сказал: «Когда я употребляю слово, оно означает только то, что я хочу, чтобы оно означало – ни больше, ни меньше». Вот моя любимая цитата из Ларри Уолла [Larry Wall]: «Скажем, вы вернулись в прошлое к Аде Лавлейс ['''Ada Lovelace, дочь поэта Байрона; считается самым первым программистом, – прим. ред.'''] и спросили бы ее, в чем разница между скриптом [сценарием] и программой. Она бы, наверное, улыбнулась и сказала что-то типа: “Ну, сценарий дают актерам, а программку – публике”».&lt;br /&gt;
&lt;br /&gt;
И моя самая любимая, из Роберта Ферта [Robert Firth]: «Одной из главных причин падения Римской Империи было отсутствие нуля в нумерации: не было способа узнать, что их программы на C успешно завершились».&lt;br /&gt;
&lt;br /&gt;
===Это терминал===&lt;br /&gt;
&lt;br /&gt;
Заметили, как трудно стало встретить добрую старую командную&lt;br /&gt;
строку? Раньше вы просто загрузили бы компьютер и сразу ее увидели, но в современных дистрибутивах, чтобы до нее добраться, нужно&lt;br /&gt;
пройти через три уровня меню. В Vista – четыре. В поисках этой подсказки я теперь начинаю чувствовать себя изгоем, вынужденным&lt;br /&gt;
мокнуть под дождем на заднем дворе, чтобы выкурить сигарету. Итак, вот мое «впечатление художника» о том, как найти командную строку&lt;br /&gt;
в Intrepid Ibex.&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>