16

Есть ли какая-либо команда / программа, с помощью которой я могу мгновенно выключить свою систему (от 1 до 5 секунд)?

Обновление (2015): Спасибо тем, кто предложил отключить через розетку. :D

Обновление (2016): @technophile предложил добавить в вопрос некоторую информацию, описывающую природу проблемы - главным образом, какой сценарий я пытался решить. Вот сценарий, по которому этот вопрос был задан несколько лет назад.

Мы строили систему для развертывания в общественных местах, таких как (аэропорты, отели и т.д.). Люди могут использовать эту систему для интернет-серфинга, проверки своей электронной почты или даже бронирования и т.д. С помощью своих кредитных карт. Созданная система гарантировала, что второй пользователь никоим образом не сможет получить информацию (электронную почту, кредитные карты) о предыдущем пользователе этой системы, даже если программное обеспечение типа клавиатурных шпионов каким-либо образом будет установлено. Как система убедилась в этом? Ну, детали не могут быть переданы, потому что это не публичная информация. но мы разработали способ всегда иметь новую операционную систему (как будто она была недавно установлена) для нового пользователя системы. Единственная проблема заключалась в том, что нам пришлось выключить компьютер и снова запустить его, как только первый пользователь покинет машину.

И я хотел, чтобы это отключение происходило быстро (вот почему вопрос), и следующая загрузка тоже была очень быстрой, поэтому я исследовал и попробовал большое количество дистрибутивов Linux от Damn Small Linux до Slackware, Debian и т.д., Но это отдельная история.

9 ответов9

27
sudo shutdown -h now
11

Я не предлагаю делать следующее, если вас не принуждают действительно особые причины:

kill -SEGV 1   # should generate a core dumps and kernel panic
kill -ABRT 1   # should generate a core dumps and kernel panic
kill -9 1      # On old systems worked nowadays not

Это грубо, жестоко, и это можно считать близким эквивалентом отсоединения шнура питания...


Несколько слов, ака История, глава I
В начале был init, и это будет до самого конца.

Весь Linux зависит от заботливого отношения к init [ 1 ] [ 2 ]. Тем не менее, и не без некоторой степени неблагодарности было время, когда добрый лорд- пользователь root мог предать эту любовь и внезапно kill init с неопровержимым (-9) порядком.
(«Книга этикета» предписывает пользователям графов, герцогов и маркизов обращаться к sudo).

Затем некоторые волшебники создали заклинание, чтобы защитить init (из Книги man 2 init)

Единственные сигналы, которые могут быть отправлены в ID процесса 1, процесс init, - это сигналы, для которых init явно установил обработчики сигналов. Это сделано для того, чтобы система не была случайно отключена.

(Наши шпионы сообщают [ U1 ], что init будет обрабатывать 1 HUP 6 ABRT 11 SEGV 15 TERM 30 PWR 2 INT 10 USR1 14 ALRM 17 CHLD 32)
Итак, хороший лорд- пользователь изучает новости и меняет команду в kill -ABRT 1 или kill -SEGV 1 которая обычно генерирует панику ядра и дамп ядра.

Это работает, потому что init - первый процесс, который запускается и получает PID номер 1 [ 2b ].

Это небезопасно, неразумно, и вы чувствуете, что это предвестник дурного предзнаменования и проклятия, но если вы не можете материально возложить руки и отключить его ...

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


Правильный путь
"Non nobis, Domine, non nobis, sed nomini tuo da gloriam.", Девиз тамплиеров.
Правильный способ - использовать shutdown [ 3 ]

sudo shutdown -h now

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

но с -h now у них не будет достаточно времени, чтобы сделать так много ...


Несколько слов, ака История, Глава II
Когда-то с неба люди над Unix почувствовали некоторые логические шаги:

После того, как системные процессы были уничтожены, а файловые системы отключены, система останавливается / выключается или автоматически перезагружается. Это делается с помощью команды останова или перезагрузки, которая синхронизирует изменения на дисках, а затем выполняет фактическое отключение / выключение питания или перезагрузку. [ 4 ]

Действительно, в настоящее время мы больше не верим в существование трех Moirai [ 5 ] в мире Linux: reboot , poweroff и halt [ 6 ]: современной науки ls -l $(which poweroff halt reboot) и один из man reboot , открывает новый свет на этот темный век и сообщает нам, что существует только одна истинная команда, которая анализирует все их параметры, так что мы наконец можем свободно запрашивать действия, противоречащие именам их команд! halt -p или reboot -p для poweroff shutdown -r для reboot ...)

Теперь, когда все казалось ясным и удобным для всех, слухи утверждают [ 7 ], что в преисподней systemd toolset [ 8 ] была совершена революция, оставив неосведомленным весь мир. Благодаря армии прокладок обратной совместимости мы даже не заметили, что перезагрузка, poweroff, halt [ 6 ] и даже telinit [ 9 ] и shutdown [ 3 ] уже привязаны к новому королю systemctl [ 10 ]. Пожалуйста, слушайте всю историю от оригинального голоса JdeBP The Bard [ 9 ], потому что у меня больше нет дыхания.

Если вы являетесь последователями культа Ubuntu, вы все же можете некоторое время оставаться в курсе всех этих утверждений [ 11 ].


Средиземье halt -f , init , telinit , systemctl
Поиск решения быстрее, чем правильный, но также и мудрый.

systemctl --force --force poweroff  # the most close to kill -9 1 
systemctl --force poweroff          # rough but still safe
sudo halt -f                                       # rough
sudo telinit 0        # or 6                       # safe
kill -SIGINT 1        # cause reboot   as the reboot command
kill -SIGRTMIN+4 1    # cause shutdown as the halt command

То, что вы находитесь под systemd или нет, вы сможете остановить компьютер, не вызывая все правильные процедуры удаления (и так быстрее):

  1. halt -f: указание опции -f (обратите внимание, что вам нужно -f чтобы избежать процедуры выключения) с помощью указанной выше команды, с помощью sudo poweroff -f или, возможно, даже с sudo reboot -f -h . Действительно, мы можем прочитать из man reboot (и его эквивалентов) о необходимости указать опцию -f чтобы избежать вызова shutdown:

    При вызове с параметром --force или на уровне выполнения 0 или 6 этот инструмент вызывает сам системный вызов reboot (2) (с переданным аргументом REBOOTCOMMAND) и непосредственно перезагружает систему .

    В противном случае это просто вызывает инструмент shutdown (8) с соответствующими аргументами без передачи аргумента REBOOTCOMMAND.

    -f, --force
    Не вызывает shutdown (8) и вместо этого выполняет фактическое действие, которое вы ожидаете от имени .

  2. Кроме того, вы можете использовать telinit [ 2b ] (или init напрямую)

    sudo telinit 0    # or 6
    

    сказать init изменить уровень запуска ... но если так, почему бы не убить его напрямую?

  3. В systemd вы можете использовать неразумный двойной параметр --force --force

    systemctl --force --force poweroff  
    

    Чтение из руководства systemctl [ 10 ]

    -f, --force
    При использовании с enable перезаписать любые существующие конфликтующие символические ссылки.
    При использовании с halt poweroff reboot или Kexec, выполнить выбранную операцию без отключения всех устройств. Однако все процессы будут принудительно убиты, а все файловые системы отключены или перемонтированы только для чтения. Следовательно, это радикальный, но относительно безопасный вариант запроса немедленной перезагрузки. Если --force указан дважды для этих операций, они будут выполнены немедленно, без остановки каких-либо процессов или размонтирования файловых систем. Предупреждение: указание --force дважды для любой из этих операций может привести к потере данных.

Ps> Вдохновитесь вариантами из хвоста JdeBP The Bard [ 7 ].

7

Вы можете немедленно выключить компьютер без синхронизации дисков, написав "o" в /proc /sysrq-trigger от имени root.

В качестве сценария оболочки это будет выглядеть примерно так:

#!/bin/sh
echo o >/proc/sysrq-trigger

Если у вас есть разрешения для /proc /sysrq-trigger, вам не нужно включать его через sysctl. Эта опция влияет только на запуск с клавиатуры.

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

Я использую это в Google Compute Engine, чтобы забивать шаблонные экземпляры прямо перед десятиминутной отметкой, чтобы максимизировать рентабельность кластерных заданий, это прекрасно работает.

6

Вы должны использовать комбинацию клавиш Magic SysRq REISUB.

Повторяйте за мной: « Разводить слонов так скучно ... »

4
poweroff

Это должно работать на большинстве распространенных дистрибутивов. В отличие от shutdown , во многих системах вы можете выполнить это как обычный пользователь (sudo не требуется).

Изменить: Дальнейшее чтение:

2

В некоторых дистрибутивах linux shutdown предлагает опцию -n. (См. Отключение человека). Некоторые дистрибутивы (такие как Ubuntu, который использует upstart вместо sysvinit) не поддерживают его флаг, однако, и этот флаг (как можно узнать из man-страницы) не без риска. Хотя я использую это годами (на моем ноутбуке меня не волнует, что все демоны завершены должным образом, он просто хочет, чтобы все было уничтожено и мой дисковый кэш был сброшен) (это быстрее, чем обычное завершение работы, и более безопасно, чем вытягивание подключи (и друзья)). Вы могли видеть, решает ли это вашу проблему.

2

Взято с другого сайта SE:

Alt + SysRq + B - это мгновенная перезагрузка, а Alt + SysRq + O - мгновенное отключение.


Ссылка: здесь

1

Удерживайте кнопку питания около 4 секунд, это довольно быстро.

1

Я использовал этот маленький скрипт, чтобы выключить систему. На самом деле, он использовал это для шутки на машине "прототипирования": «Эй, чувак, давай посмотрим, что это за классная .sh!"

#!/bin/bash
echo 1 > /proc/sys/kernel/sysrq-trigger; #enables sysrq triggers
echo u > /proc/sysrq-trigger # remount the system as ready only
#edited# echo s > /proc/sysrq-trigger # sync all write-pending data to disk
sync
echo o > /proc/sysrq-trigger # shut off the system power.

(Этот сценарий имитирует то же самое, что и нажатие Alt + SysRq + u/s/o, как описано ранее.) Конечно, я не вызываю ненормальное завершение работы системы (могут произойти сбой таблиц mysql и т.д.), Поэтому используйте только на фиктивных машинах. Примечание. Синхронизация может занять некоторое время. Я видел, что если в системе много свободной памяти (для кеша), и вы копируете кучу файлов на флеш-накопитель, синхронизация занимает больше времени, но я рекомендую это даже для шутки.

Редактировать: лучше использовать sync вместо записи 's' в sysrq-trigger: запись 's' не будет блокировать выполнение скрипта, поэтому после запроса записи кэша на диск машина немедленно отключится. В отличие от команды sync , sync будет возвращена после завершения процесса записи. Таким образом, выполнение скрипта будет заблокировано до завершения очистки кеша.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .