Как уже говорилось, операция, обратная загрузке ситемы — останов — устроена в 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
Пример 12. Использование shutdown
Остаётся заметить, что у shutdown
есть обязательный параметр — время начала останова, в примере он равен «+3
», то есть «через три минуты», и необязательный — «-r
» (reboot, перезагрузка) или «-h
» (halt, останов). Без необязательных параметров выполняется переход на первый уровень выполнения, причём запускается стартовый командный интерпретатор суперпользователя, а после его завершения система вновь переходит на уровень выполнения по умолчанию (используется, например, для профилактических действий в системе). Нажатие Ctrl+Alt+Del
или кнопки выключения питания (в системах, гда эта кнопка ничего не выключает, а лишь посылает соответствующий аппаратный сигнал) приводит к запуску именно shutdown -r
или shutdown -h
.