Операционная система Linux

         

Останов системы


Как уже говорилось, операция, обратная загрузке системы - останов - устроена в Linux как специальный уровень выполнения: 0 - если требуется выключить систему, и 6 - если требуется перезагрузка. Соответствующие каталоги rc0.d и rc6.d будут состоять почти сплошь из ссылок вида K*, но как минимум один сценарий, killall, будет запущен с параметром "start". Этот сценарий остановит все процессы, которые не были остановлены K-сценариями: программы пользователей, демоны, запущенные администратором вручную, и т.п.

Нечего и говорить, что отключение электропитания в разгар работы системы - операция очень рискованная. Даже в самом удачном случае при повторной загрузке rc.sysinit увидит, что файловые системы не были размонтированы, и станет проверять их целостность. В не самом удачном случае эта целостность будет нарушена: некоторые открытые на запись и не закрытые файлы окажутся в странном, недописанном состоянии, появятся индексные дескрипторы, не связанные ни с каким каталогом и т.п. Как правило, такие ошибки исправляются программой восстановления файловых систем fsck: с одной стороны, за счет дополнительных свойств файловой системы (журнализация, сводящая вероятность порчи к минимуму, логически упорядоченная запись и т.п.), с другой - за счет некоторых предположений, которые делает сама утилита fsck. Однако надеяться на нее нельзя: очень редко, но бывают неразрешимые противоречия в лишенной цельности файловой системе, и тогда fsck обращается за помощью к администратору, требуя подтверждения действий (например, для удаления испорченного файла, который точно раньше был), или выполняя эти рискованные действия автоматически. В первом случае все время взаимодействия с администратором система будет работать в однопользовательском режиме, причем администратору предстоит разбираться с тем, что получилось; а во втором есть нешуточная вероятность того, что система испортится, а замечено это будет слишком поздно.

Останов системы может занимать больше времени, чем загрузка: например, процессы, выполняющие системный вызов (скажем, чтения с дискеты), не завершаются по сигналу TERM сразу, а получив его, могут некоторое время заниматься обработкой (дописыванием в файл и т.п.). Остановка службы, особенно сетевой, тоже может длиться долго: например, когда требуется сообщить о закрытии сервиса каждому клиенту. Однако только в этом случае можно быть уверенным, что все процессы завершились нормально, и что после перезагрузки они продолжат нормально работать.

В экстренных случаях (например, когда при сбое электропитания демон, обслуживающий устройство бесперебойного снабжения, сообщает, что ресурсы на исходе) безопаснее все-таки быстро поостанавливать процессы, чем дожидаться отключения питания на работающей системе. Для этого можно послать всем процессам сначала TERM, а короткое время спустя - KILL. Для обработки таких ситуаций в inittab есть методы, начинающиеся со слова "power", а в /etc/rc.d - специальный сценарий rc.powerfail. На самый крайний случай существуют команды halt и reboot с ключом -f, однако их почти мгновенное действие практически эквивалентно внезапному отключению питания, и использовать их не рекомендуется.

Для останова или перезагрузки системы можно выполнять команды init 0 и init 6. Они вполне справятся с оповещением и остановкой активных программ, что займет минуту-две. А вот с пользователями, работающими в системе, все сложнее. Как правило, для завершения работы требуется хотя бы минут пять, а лучше - десять. Поэтому вежливые администраторы пользуются утилитой shutdown, которая запускается за несколько минут до времени перезагрузки, каждую минуту предупреждая пользователей о грядущем событии, после чего уже запускают init:


[root@localhost root]# shutdown -r +3 "Sorry, we need to reboot" Broadcast message from root (ttyS0) (Sun Nov 28 14:05:41 2004): Sorry, we need to reboot The system is going DOWN to maintenance mode in 3 minutes! . . . Broadcast message from root (ttyS0) (Sun Nov 28 14:06:41 2004): Sorry, we need to reboot The system is going DOWN to maintenance mode in 2 minutes! . . . Broadcast message from root (ttyS0) (Sun Nov 28 14:07:41 2004): Sorry, we need to reboot The system is going DOWN to maintenance mode in 1 minute! . . . Broadcast message from root (ttyS0) (Sun Nov 28 14:08:41 2004): Sorry, we need to reboot The system is going down to maintenance mode NOW! INIT: Switching to runlevel: 6 . . .

Пример 10.12. Использование shutdown (html, txt)

Остается заметить, что у shutdown есть обязательный параметр - время начала останова (в примере он равен "+3", то есть "через три минуты"), и необязательный - "-r" (reboot, перезагрузка) или "-h" (halt, останов). Без необязательных параметров выполняется переход на первый уровень выполнения, причем запускается стартовый командный интерпретатор суперпользователя, а после его завершения система вновь переходит на уровень выполнения по умолчанию (используется, например, для профилактических действий в системе). Нажатие Ctrl+Alt+Del или кнопки выключения питания (в системах, где эта кнопка ничего не выключает, а лишь посылает соответствующий аппаратный сигнал) приводит к запуску именно shutdown -r или shutdown -h.



  4)

  Т.е. на нулевой дорожке нулевого цилиндра, начиная с сектора 2. Эта область диска часто не используется под файловые системы (см. лекцию 11).

  5)

  Не надо вручную пересобирать ядро, даже если в учебнике по Linux рекомендуется это сделать!

  6)

  Этим он скорее похож на динамическую библиотеку.

  7)



  Mingetty - упрощенный аналог getty, работающий только на виртуальных консолях.

  8)

  Понятно, что Ctrl+Alt+Del - это не reset, а обычное сочетание клавиш. Для удобства пользователя его специально распознает клавиатурный драйвер, а ядро сообщает об этом init-у.

  9)

  В некоторых дистрибутивах Linux такая команда может называться invoke-rc.d, а команда, аналогичная описанному ниже chkconfig - update-rc.d.

  10)

  В некоторых дистрибутивах - в каталоге /etc/.

  11)

  Не путать с диспетчером окон, описанным в лекции 15.

© 2003-2007 INTUIT.ru. Все права защищены.

Содержание раздела