Debian halt не выключает

Обновлено: 02.07.2024

Во время использования операционной системы Linux возникают ситуации, при которых процессы зависают и вы не можете их завершить. Например, вы хотите закрыть графическую программу или сервис, отправляете сигнал TERM, что в переводе означает завершить, а программа не реагирует на него.

Дело в том, что для того, чтобы программа могла завершится с помощью сигнала TERM, она должна быть в рабочем состоянии. Это сигнал просит программу завершится. Если программа зависла, она может попросту не получить ваш сигнал. Или программа может его обработать но не завершатся, этот сигнал носит рекомендательный характер. Вот возможные причины и варианты решения:

  • Недостаточно прав - вы не можете убить процесс, запущенный от имени другого пользователя, используйте sudo;
  • Программа зависла - необходимо ей послать сигнал KILL;
  • Программа стала зомби - необходимо уничтожить её родительский процесс.
  • Программа ждет ответа от драйвера - ждать или перезапустить компьютер.

В любом случае сначала пробуем от имени суперпользователя:

sudo kill -KILL идентификатор_процесса


Сначала можно попробовать завершить программу с помощью сигнала KILL, для этого передайте -KILL или -9 в виде опции утилите kill:

kill -KILL идентификатор_процесса

Если это не работает, можно попробовать посмотреть родительский процесс программы с помощью утилиты ps:

ps -xal | grep идентификатор_процесса

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

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Выключение компьютера - действие, с которым обычные пользователи сталкиваются чуть ли не каждый день. Если выключать сервер приходится довольно редко, то обычные, десктопные компьютеры подвержены этой операции очень даже часто. Большинство пользователей выключают linux в графическом интерфейсе системы. В окружении рабочего стола KDE это делается через главное меню, а в Gnome и Unity даже есть специальная кнопка на панели для решения этой задачи.

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

Процесс выключения Linux

Часто для выключения Linux из терминала используется утилита shutdown. Есть также команды poweroff, halt, но они для нестандартных случаев. Также выключить linux из консоли можно с помощью сочетаний клавиш SysRQ. Но сначала давайте рассмотрим синтаксис команды shutdown. Естественно, команда shutdown в Linux или любая другая не самостоятельно завершает работу системы и выключает компьютер. Она всего лишь передает запрос на выключение системе инициализации, а затем ядру. А уже они выполняют ряд сложных операций по подготовке и выключению компьютера. Если кратко, то вот они:

  • Завершение процессов пользователя.
  • Сигнал SIGTERM всем процессам.
  • Сигнал SIGKILL всем процессам.
  • Монтирование файловых систем в режиме только для чтения.
  • Подготовка внешних устройств к отключению.
  • Блокировка пространства пользователя, чтобы гарантировать, что ни один код пользователя больше не будет запущен.
  • Завершение работы и отключение питания большинства периферических устройств.
  • Отключение питания компьютера.

Теперь вы понимаете суть процесса выключения и то почему нельзя просто выдернуть шнур питания с розетки. Если это сделать, компьютер отключится моментально и не выполнит всех необходимых операций, а это может грозить потерей не сохраненных или даже недавно сохраненных данных, повреждением файловой системы и т д. Поэтому желательно выключать компьютер правильно с помощью shutdown или других специальных утилит.

Синтаксис и опции shutdown

Синтаксис команды очень простой:

Вот основные опции утилиты:

Вот в принципе и все опции утилиты, их больше чем достаточно для такого простого действия. Теперь можно переходить к примерам, но сначала давайте рассмотрим, что же происходит во время включения Linux.

Выключение компьютера в Linux

1. shutdown

Самая простая и самая часто используемая команда выключения компьютера linux, отключит компьютер немедленно:

sudo shutdown -h now

Как видите, используется обычное выключение, и константа времени now, тоесть сейчас.

Теперь попробуем запланировать выключение компьютера linux через пять минут:

sudo shutdown -h +5 "Компьютер будет выключен через 5 минут"

sudo shutdown -c

Точно так же мы можем указать точное время выключения, например в девять вечера:

sudo shutdown -h 21:00

Как я уже говорил, не только команда shutdown linux умеет выключать компьютер, есть еще несколько утилит способных на это. Рассмотрим их тоже.

2. reboot

Команда reboot обычно используется для перезагрузки системы, но она также умеет выключать компьютер. Мы не будем ее подробно рассматривать, потому, что она еще проще команды shutdown. Для выключения нужно задать опцию -p:

3. halt

Эта команда тоже выключает компьютер. Только делает она это очень по-своему. Она не выполняет никаких подготовительных действий перед выключением, а просто отключает питание:

Использование halt может повредить систему

4. poweroff

Это аналог halt, делает в точности то же самое:

5. SysRQ

Помните, в начале статьи, я говорил о сочетании клавиш для включения компьютера? Рассмотрим этот вопрос подробнее.

SysRQ - это подсистема, реализованная на уровне ядра. Ядро обрабатывает все нажатия клавиш, а с помощью этой подсистемы, оно может принимать от пользователя команды, даже когда система полностью зависла. Основное предназначение этой подсистемы - работа с компьютером в проблемных ситуациях, например, если вы думаете что ваш компьютер заразил вирус, или компьютер завис и его нужно выключить. Для доступа к SysRq используются сочетания клавиш Alt+PrtScr+номер

Самое интересное, что мы можем выполнить безопасное выключение компьютера linux. Для этого зажмите клавиши Alt + PrtScr и поочередно нажимайте:

  • R - разблокировать клавиатуру;
  • E - послать всем процессам сигнал SIGTERM;
  • I - послать всем процессам сигнал SIGKILL;
  • S - перенести все данные из кеша файловых систем на диск;
  • U - перемонтировать файловые системы только для чтения;
  • B - перезагрузить.

Также вместо всего этого можно воспользоваться сочетанием клавиш Alt+PrtScr+O, в таком случае, вся процедура будет выполнена автоматически, эта команда поддерживается не всеми ядрами.

6. Графический интерфейс

Выключить компьютер в графическом интерфейсе ещё проще. Для этого кликните по иконке выключения в правом верхнем углу, а затем выберите Выключить/Завершить сеанс, затем Выключение.. и снова Выключить:

Выводы

Теперь вы знаете все что нужно, о том, как выключить Linux через терминал. Если вас застигнет врасплох ошибка или зависание компьютера, вы знаете что делать. Если остались вопросы - пишите в комментариях!

Plus: Old Red Hat based versions are able to power off with halt too.

I am trying to understand why in Debian 9 you should not use halt to turn off your computer anymore. That behavior are removed from systemd. I am a bit scary, but I think there must be a good logical reason.

Are other unixes or unix-like with this same behavior or are Linux turning into something different?

Now if you want to turn off the machine after the system shutdown you should use poweroff instead of halt.

Somebody know how this command are interpreted in other Unix-Like?

That is not a duplicated, because, debian 7 can power off with halt for example.


5,934 2 2 gold badges 21 21 silver badges 53 53 bronze badges Plain halt powers off a macOS system, but not an OpenBSD system. halt is not a POSIX utility, nor is poweroff or shutdown or any similar utility. Yes, exactly, I am trying to understand why this change happened. Thank you. halt allows for the system to be halted with diagnostic kernel messages still visible on the console on some systems; this is the reason for a distinction between halt and poweroff to exist at all.

2 Answers 2

Debian

When using SysVinit in Debian(esque) systems, /etc/defaults/halt includes a variable that defines whether the system will run halt or poweroff at the end of transition to runlevel 0. The default setting is HALT=poweroff .

Before SysVinit 2.74 you were not supposed to run halt directly, and starting from that version, the SysVinit halt command will just call shutdown -h unless the current runlevel is 0 or 6. This is documented in halt(8) man page. At the end of transition to runlevel 0 the runlevel scripts will run $HALT , which is equal to poweroff by default.

RHEL/CentOS

Since the same script is also run at the end of transition to runlevel 6 (reboot), the actual command to run is defined by the variable $command , and it will be either /sbin/halt or /sbin/reboot . According to the value of the $INIT_HALT variable, the script will decide whether or not add the -p option. That variable is set by /sbin/shutdown . The RHEL 5.11 shutdown(8) man page says:

HALT OR POWEROFF

The -H option just sets the init environment variable INIT_HALT to HALT, and the -P option just sets that variable to POWEROFF. The shutdown script that calls halt(8) as the last thing in the shutdown sequence should check these environment variables and call halt(8) with the right options for these options to actually have any effect. Debian 3.1 (sarge) supports this.

(Yes, the RHEL 5.11 man page mentions Debian 3.1! I guess someone at RedHat porting patches from various sources to RHEL missed one reference. )

It looks like RedHat has decided to code the above-mentioned test in the /etc/init.d/halt script in such a way that switching off the power (using /sbin/halt -p at the end of shutdown) is the default halt action: the only way to achieve halt without poweroff is to use the upper-case -H option of the shutdown command to explicitly request it, e.g. shutdown -hH now

But again, the default powerdown is triggered by the runlevel scripts customized by the Linux distribution, so it's not really a feature of the SysVinit halt command.

Historical note

Old SysVinit-using systems (both Linux and non) used to have several commands that were not intended to be used directly, but only as part of the appropriate shutdown/reboot scripts. Before SysVinit 2.74, the /sbin/halt command with no options would have done the same as halt -f of modern SysVinit does, i.e. a brutal, immediate kernel shutdown without stopping any services or unmounting filesystems.

For the same reason, being used to the Linux killall command can be dangerous on other Unixes. Its man page even has this ominous warning:

Be warned that typing killall name may not have the desired effect on non-Linux systems, especially when done by a privileged user.

This is because the classic SystemV killall was one of those commands designed to be used only as part of a shutdown script. In Linux distributions with SysVinit, the classic version of the command may be found as killall5 . It literally kills all processes except kernel threads and processes in its own session: its intended use is in a shutdown script after shutting down all services, just before unmounting the local filesystems, to kill of any other processes that might delay or prevent the unmounting.

(How I know this, you ask? Well, I once made the mistake of running killall <something> as root on a Solaris 2.6 system. A very effective learning experience.)

Читайте также: