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

Завершение работы переходит в непрерывный сон после отправки настенного сообщения

У меня есть сервер, который я администрирую удаленно через SSH, по разным причинам его нужно перезапустить. Однако когда я пытаюсь это сделать, shutdown переходит в непрерывный сон практически сразу после отправки настенного сообщения.

$ ps aux | grep 'shutdown'
root      4754  0.0  0.1   1888   720 ?        D    07:26   0:00 shutdown -r 0 w

В настоящее время у меня нет физического доступа к машине. Что я должен делать? Сервер все еще отвечает, и я все еще могу войти в систему.

Включите ключ Magic SysRq с помощью:

echo "1" > /proc/sys/kernel/sysrq

и выполните чистую перезагрузку, выполнив следующие действия:

  1. Alt + SysRq + e
  2. Alt + SysRq + u
  3. Alt + SysRq + i
  4. Alt + SysRq + b

Состояние D не "мертвое", оно заблокировано в ожидании ввода-вывода диска.

Что-то вроде "reboot -n -f" более убедительно и может сработать. У вас проблемы с файловой системой? Команда shutdown записывает запись wtmp перед тем, как сообщить init о завершении работы.

Я видел, как завершение работы зависало, если есть (устаревшие) монтирования NFS или сервер подключен к SAN. Вот вам контрольный список:

  • Вы все еще видите все крепления дисков с df -h (или иначе получить доступ к креплениям)?
  • Есть ли другие процессы, кроме shutdown в D штат?
  • Делает dmesg вернуть вам что-нибудь о вводе-выводе, или вас ждет даже небольшая симпатичная паника ядра?
  • Если есть процессы, использующие какое-либо монтирование SAN / NFS, можете ли вы остановить эти процессы вручную, проверьте с помощью lsof что на этом монтировании нет открытых файлов, а затем umount это крепление?
  • Если btrace установлен, делает btrace /your/disk что-то вернуть?

Если все остальное не сработает, раздел SysRq, предоставляемый @quanta, должен работать, НО сначала убедитесь, что есть кто-то, кто может физически присматривать за сервером, если он по какой-то причине не загружается правильно.

shutdown вероятно ждет, чтобы написать что-то вроде /dev/initctl - использовать strace -p 4754 чтобы увидеть, где он висит, а затем исправить то, что сломано.