UNIX-системы хранят буферы изменений в памяти и лишь изредка записывают их на диск. Это ускоряет выполнение операций дискового ввода-вывода, но также делает систему более подверженной потерям данных в случае внезапных зависаний.
Раньше UNIX-системы были очень щепетильны в отношении процедуры выключения. Современные системы более терпимы, но все же по возможности лучше корректно завершать работу. Неправильное выключение системы может привести к появлению труднообнаруживаемых, неочевидных ошибок, а иногда и к полному краху.
Перезагрузка операционной системы на персональном компьютере – средство решения почти всех проблем. Но при работе в UNIX советуем сначала подумать и только потом перегружаться. Проблемы, возникающие в этой системе, как правило, скрытые и сложные, поэтому перезагрузка дает ожидаемый результат гораздо реже, чем в других системах. Кроме того, процесс перезагрузки UNIX занимает больше времени, что создает неудобства для пользователей.
Перезагружаться необходимо в том случае, когда подключается новое устройство или работающее устройство зависает так, что его невозможно сбросить. Если модифицируется файл конфигурации, который используется только при начальной загрузке, то изменения вступят в силу лишь после перезагрузки. И на конец, если систему «заклинило» так, что в ней невозможно зарегистрироваться, иного выхода, кроме как перезагрузится, просто не существует.
В отличие от начальной загрузки, которая осуществляется одним-единственным способом, останов и перезагрузку системы можно выполнить по-разному:
-
выключить питание;
-
дать команду shutdown;
-
использовать команды halt и reboot (в BSD-системах и Linux);
-
послать программе init сигнал TERM;
-
изменить уровень выполнения программы init с помощью команды telinit (в системах семейства System V);
-
уничтожит процесс init
Выключение питания
Даже в небольших UNIX-системах такой способ останова неприемлем. Он может привести не только к потере данных и повреждению системных файлов. Вы рискуете испортить дисковод, если он относится к числу тех, на которых перед отключением питания необходимо установить в соответствующие положение защитный переключатель либо произвести парковку головок.
В некоторых компьютерах (например, Hawlett-Packard) присутствует кнопка программного останова, при нажатии которой выполняется ряд команд, осуществляющих корректное завершение работы системы. Если вы не уверены, поддерживает ли ваш компьютер такую возможность, не нажимайте кнопку выключения питания в процессе работы системы. Будет меньше проблем, если остановить систему вручную.
Конечно, в случае наводнения или пожара лучше отключить питание, если вы не успеваете корректно остановить систему. В машинных залах и сей час иногда встречается аварийная кнопка, которая позволяет выключить все оборудование одновременно.
Команда shutdown: корректный способ останова системы
Команда shutdown – самый безопасный и наиболее корректный способ остановить или перезагрузить систему либо вернутся в однопользовательский режим. К сожалению, трудно найти поставщика, который бы «не приложил руку» к ее аргументам. Мы рассмотрим эту команду в общем, а затем приведем сводку синтаксиса и аргументов, которые пригодятся при работе в какой-либо из описываемых систем.
Можно дать команде shutdown указание делать паузу перед остановом системы. Во время ожидания команда посылает зарегистрированным пользователям через постепенно укорачивающиеся промежутки времени сообщения, предупреждая их о приближающемся останове. По умолчанию в сообщениях говорится о том, что система заканчивает работу, и указывается время, оставшееся до останова. При желании администратор может добавить собственное короткое сообщение, в котором поясняется, почему система останавливается и сколько примерно времени придется подождать, прежде чем пользователи вновь смогут войти в систему.
Многие версии команды shutdown позволяют задать, что конкретно должна сделать система: остановится, перейти в однопользовательский режим или перезагрузится. Иногда можно также указать, необходимо ли после перезагрузки проверить диски с помощью команды fsck. В современных системах с большими дисками такая проверка займет много времени, поэтому в общем случае ее можно не выполнять, если работа системы была перед этим корректно завершена. В некоторых системах этап проверки дисков автоматически пропускается, если файловые системы были правильно демонтированы.
В табл. 2.6 перечислены аргументы командной строки команды shutdown для шести рассматриваемых систем. Прочерк означает вариант по умолчанию.
Таблица 2.6. Многоликая команда shutdown
|
Система
|
Путевое имя
|
Пауза
|
П1
|
О
|
В
|
Без fsck
|
|
Solaris
|
/usr/sbin/shutdown
|
-gсекунд
|
-i6
|
-i0
|
-iS
|
-
|
|
HP-UX
|
/etc/shutdown
|
секунды
|
-r
|
-h
|
-
|
-
|
|
Red Hat
|
/sbin/shutdown
|
время
|
-r
|
-h
|
-
|
-f
|
|
FreeBSD
|
/sbi/shutdown
|
+минуты
|
-r
|
-h
|
-
|
-
|
1 П – перезагрузка, О – останов, В – вход в однопользовательский режим
Команда halt: более простой способ останова
Команда halt выполняет все основные операции, необходимые для останова системы. Чтобы вызвать эту команду, можно в командной строке указать shutdown -h или непосредственно halt. Команда halt регистрирует в журнальном файле событие останова, уничтожает несуществующие процессы, выполняет команду sync (она, в свою очередь, осуществляется вызов sync), дожидается завершения операций дисковой записи, а затем прекращает работу ядра.
При указании команды halt -n системный вызов sync подавляется. Эта команда используется после восстановления корневого раздела командой fsck, чтобы ядро не могло затереть исправления старыми версиями раздела, хранящимися в кэше. Команда halt -q инициирует почти немедленный останов без синхронизации, уничтожения процессов и регистрации событий. Флаг -q используется редко.
Команда reboot: быстрый перезапуск
Команда reboot почти идентична команде halt. Разница заключается в том, что система перезагружается, а не останавливается. Режим перезагрузки вызывается также командой shutdown -r. помимо этого, команда shutdown поддерживает флаги -n и -q.
Передача программе init сигнала TERM
Результаты уничтожения программы init непредсказуемы и в большинстве случаев очень вредны. Перед тем как посылать этой программе какой-либо сигнал, обратитесь к документации. Когда BSD-версия программы init получает сигнал TERM, она обычно уничтожает все пользовательские процессы, демоны, процессы getty и переводит систему в однопользовательский режим. То же самое делает команда shutdown.
Для того чтобы послать процессу сигнал, нужно с помощью команды ps узнать идентификатор этого процесса. Программа init – это всегда процесс номер один. С целью отправки сигнала воспользуйтесь командой kill:
# sync; sync
# kill –TERM 1
Команда telinit: изменение уровня выполнения программы init
В системах, где программа init поддерживает несколько уровней выполнения, можно с помощью команды telinit дать программе указание перейти на конкретный уровень. Например, команда
# telinit S
переводит систему в однопользовательский режим в Solaris и HP-UX. В Red –Hat необходимо указать 1, а не S, иначе будет запущен интерпретатор shell с правами пользователя root, а сам уровень изменен не будет:
# telinit 1
То же самое можно сделать с помощью команды
# shutdown –i1
которая, помимо всего прочего, может выдать предупреждающие сообщение и сделать небольшую паузу перед переходом на новый уровень.
Команда telinit наиболее полезна при проверке изменений, внесенных в файл inittab. При наличии флага -q команда заставит программу init повторно прочитать этот файл.
Уничтожение процесса init
Процесс init настолько важен для работы системы, что если его уничтожить с помощью команды kill -KILL или kill -9, то большинство систем автоматически перезагрузится (некоторые ядра при этом просто выдают сообщение о панике – фатальной ошибке). Это очень «грубый» способ перезагрузки. Лучше пользоваться командами shutdown и reboot.