Назад | Перейти на главную страницу

Почему «shutdown -r now» ведет себя иначе, чем «reboot -f» в Debian Linux?

Недавно мне пришлось столкнуться с надоедливой, периодически возникающей проблемой зависшей точки монтирования клиент / сервер NFS. Когда проблема возникает на клиенте, я не могу размонтировать, а также некоторые другие странности. Единственное немедленное решение, которое у меня есть на сегодняшний день, - это перезагрузить клиентский ящик.

Но shutdown -r now вообще не работает. С тех пор я обнаружил reboot -f, который делает перезагрузите систему. Зачем? Я прочитал справочные страницы, но, похоже, на мой вопрос нет ответа.

Почему shutdown -r now вести себя иначе, чем reboot -f?

(Я продолжаю решать проблему NFS, но это не мой вопрос.)

На странице руководства по выключению:

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

init запускает и останавливает задания по мере того, как система меняет уровни выполнения. При переходе на уровень запуска 6 из-за перезагрузки система запускает все сценарии в /etc/rc6.d. Поскольку ваша система не отвечает на shutdown, скорее всего, это сценарий в /etc/rc6.d (возможно K05nfs-common учитывая проблемы с NFS) зависает, не позволяя завершиться последовательности завершения работы. Фактически, последнее, что запускает init при переходе на уровень запуска 6, - это reboot -d -f -i.

reboot -f пропускает все скрипты и перезагружает систему напрямую.

shutdown инструктирует init чтобы начать процедуру выключения, которая включает в себя информирование пользователей, вошедших в систему, о завершении работы системы, корректное завершение всех процессов, размонтирование и синхронизацию дисков и т. д. Вы зависаете здесь, потому что процессы, застрявшие в ожидании ввода-вывода, как правило, очень трудно убить, а застрявшее монтирование NFS не может быть размонтировано.

reboot -f, с другой стороны, немедленно перезагружает сервер, не делая этого. (reboot это программа init призывает выключить сервер. Без -f флаг, он проверит, init думает, что в настоящее время перезагружается, и если нет, он вызовет shutdown вместо того, чтобы начать процесс).

Поскольку 'reboot -f' не переходит на уровень запуска 0 - он сообщает ОС, что нужно повторно инициализировать ЦП напрямую. На странице руководства на моем ближайшем Linux-сервере написано:

 -f     Force halt or reboot, don't call shutdown(8)

На странице руководства по выключению объясняется больше.

Если вы используете intr вариант на ваших монтировках NFS, затем shutdown -r now должен иметь возможность убивать процессы, ожидающие завершения ввода-вывода NFS. Это может привести к повреждению файла, но не более чем shutdown -f создает.