12.3. Корректное завершение работы

Очень важно корректно завершать работу своей системы. Простое отключение энергии с помощью кнопки питания может привести к серьёзному повреждению файловой системы. Пока система работает, файлы используются даже в том случае, если вы ничего не делаете. Помните, что в фоновом режиме всё время работает много процессов. Эти процессы обслуживают систему и держат открытими много файлов. Когда на системном блоке отключается питание, эти файлы не закрываются корректным образом и могут быть повреждены. В зависимости от того, какие файлы были повреждены, система может оказаться полностью в нерабочем состоянии! В любом случае при последующей загрузке системы вам придётся пройти через длительную процедуру проверки файловой системы.

Замечание

Если вы используете в своей системе журналируемые файловые системы наподобие ext3 или reiserfs, вы частично защищены от повреждения файловой системы, и проверка вашей файловой системы при перезагрузке займёт меньше времени, чем при проверке файловой системы без журналирования как в случае с ext2. Однако этот вариант защиты не является оправданием для некорректного выключения своей системы! Журналируемые ФС подразумевают защиту ваших файлов от событий, на которые вы не силах повлиять, а не от вашей личной лени.

В любом случае, когда вы перезагружаете или выключаете свой компьютер, важно сделать это правильно. Для этого есть несколько способов и вы можете выбрать любой из них на свой вкус. Поскольку выключение и перезагрузка - это похожие процедуры, большинство способов выключения системы также применимы и к её перезагрузке.

Первый способ - с помощью программы shutdown(8), и наверное это самый популярный способ. Утилиту shutdown можно использовать для перезагрузки или выключения системы в заданное время, и она может выводить всем работающим в системе пользователям сообщение о том, что система сейчас будет выключена.

Наиболее общее использование shutdown для выключения компьютера:

# shutdown -h now

В данном случае особое сообщение пользователям не отправляется. Они увидят стандартное сообщение shutdown. “now” - это время, когда мы хотим выполнить завершение работы, а “-h” означает выключение системы. Это выглядит не слишком удобным для многопользовательской системы, однако он прекрасно подойдёт для вашего домашнего компьютера. Более правильным способом в многопользовательской системе будет предоставление всем пользователям некоторого запаса времени на выход из системы:

# shutdown -h +60

При этом система будет выключена через один час (60 минут), что прекрасно подойдёт для многопользовательской системы. В важных системах выключение должно быть запланировано заблаговременно, и вам следует сообщать о времени её выключения во всех соответствующих источниках информации, используемых для системных уведомлений (электронная почта, доски объявлений, /etc/motd и др.).

Для перезагрузки системы используется та же самая команда, только опция “-h” заменяется на “-r”:

# shutdown -r now

Вы можете использовать такую же запись времени для shutdown -r, что и для shutdown -h. Есть ещё много других вещей, которые вы можете выполнить с помощью shutdown для управления выключением или перезагрузкой машины; подробности смотрите в странице руководства.

Второй способ выключения или завершения работы компьютера - это использование команд halt(8) и reboot(8). Как видно по названиям, halt немедленно останавливает операционную систему, а reboot перезагружает её (по сути reboot - это просто символическая ссылка на halt.) Вызываются они так:

# halt
# reboot

Низкоуровневый способ выключения или перезагрузки системы заключается в отправке сообщения непосредственно процессу init. Все другие методы представляют собой просто удобные способы общения с init, однако вы можете непосредственно сообщить, что нужно выполнить, с помощью telinit(8) (обратите внимание, что в названии используется только одна буква “l” (англ. tell - говорить)). С помощью telinit вы можете сообщить init'у, на какой уровень запуска нужно выполнить переход. При этом будет запущен специальный скрипт. Этот скрипт убьёт или породит процессы, нужные на этом уровне запуска. Это подойдёт для перезагрузки и выключения, потому что для обоих этих процессов есть свои специальные уровни запуска.

# telinit 0

Уровень запуска 0 - это останов системы. Сообщение init'у о переходе на уровень запуска 0, приведёт к тому, что будут убиты все процессы, файловые системы будут размонтированы и машина будет выключена. Это подходящий способ для выключения системы. На многих ноутбуках и современных настольных компьютерах это также приведёт к завершению работы системы.

# telinit 6

Уровень запуска 6 - это перезагрузка системы. Все процессы будут убиты, файловые системы будут размонтированы, а машина отправится на перезагрузку. Это также подходящий способ для перезагрузки системы.

Для любознательных, при переключении на уровень запуска 0 или 6, либо с помощью shutdown, halt или reboot, запускается скрипт /etc/rc.d/rc.6. (Скрипт /etc/rc.d/rc.0 - это символическая ссылка на /etc/rc.d/rc.6.) Вы можете изменить этот файл на своё усмотрение, однако убедитесь в том, что хорошенько протестировали свои изменения!

Существует ещё один последний способ перезагрузки системы. Для всех остальных способов необходимо, чтобы вы имели права root'а. Однако перезагрузить систему можно даже если без его привелегий, но при условии, что у вас есть физический доступ к клавиатуре. Нажатие Control+Alt+Delete (заветные “три педали”) вызовет немедленную перезагрузку машины. (На самом деле, когда вы нажимаете Control+Alt+Delete, вызывается команда shutdown.) “Педали” не всегда срабатывают при работе в X Windows. Вам может понадобиться нажать Control+Alt+F1 (или с другой функциональной клавишей), чтобы перейти в чистую консоль перед тем, как воспользоваться заветной комбинацией.

И в завершение, файл, который полностью контролирует все аспекты загрузки и выключения, - это /etc/inittab(5). В общем случае вам не нужно изменять этот файл, однако он может дать вам представление о том, почему некоторые вещи работают так, как они работают. Как всегда подробности смотрите на странице руководства.