Як миттєво вимкнути комп'ютер (від 1 до 5 секунд), не використовуючи фізичний перемикач / розетку?


17

Чи є якась команда / програма, за допомогою якої я можу негайно вимкнути свою систему (від 1 до 5 секунд)?

Оновлення (2015 р.): Дякую тим, хто запропонував вимкнути за допомогою розетки живлення. : D

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

Ми будували систему для розміщення в громадських просторах (аеропорти, готелі тощо). Люди можуть використовувати цю систему для серфінгу в Інтернеті, перевірки електронної пошти чи навіть бронювання тощо, використовуючи свої кредитні картки. Вбудована система гарантувала, що другий користувач жодним чином не може отримати інформацію (електронну пошту, кредитні картки) попереднього користувача цієї системи, навіть якщо програмне забезпечення кейлогерів типу програмного забезпечення якось встановлено. Як система переконалася в цьому? Ну, подробиці не можна ділитися, оскільки це не загальнодоступна інформація. але ми розробили спосіб завжди мати свіжу Операційну систему (ніби вона була нещодавно встановлена) для нового користувача системи. Проблема полягала лише в тому, що нам довелося вимкнути машину та підняти її знову, як тільки перший користувач покине машину.

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


1
Оскільки найшвидший код - той, який не працює, я б сказав, що найшвидший спосіб вимкнення системи - це не вмикати її. Поясніть, чого ви намагаєтесь досягти, якщо вам потрібна конкретна відповідь.
Дмитро Григор’єв

2
@ Sam152 яка стіна?
Усман

Ви хотіли також вказати "не пошкоджуючи мою систему", чи це не хвилює?
Технофіл

@Technophile звичайно не є постійною шкодою для моєї системи. Але що ви маєте на увазі?
Усман

Моя мета - уточнити, що ви просите і що ви намагаєтеся зробити. Я працюю в електроніці; чи означає "миттєво" 1 секунду? 1 мс? 1us? 1нс? Ви просто нетерплячі, чи є якась конкретна потреба? Які наслідки мають (наприклад) 6-секундний час відключення? Я працюю із вбудованою системою, яка пошкоджує її SD-карту, якщо вимкнення перевищує 5 секунд, коли кнопку живлення утримується. Що ви робите?
Технофіл

Відповіді:


32
sudo shutdown -h now

9
Це не зупинило систему миттєво . ;)
Марсель Корпель

14
@Marcel Korpel: Настільки ж миттєво, як це слід робити, не пошкоджуючи його систему;)
Фелікс,

@Felix - Я постійно чую, що Linux - це дуже надійна система, і вона не може працювати з тими ж "жорсткими перезавантаженнями", як і моя Windows? Буде дивно;)
Gnoupi

2
@Gnoupi: Жодна ОС не може бути побудована без деякої вразливості до різкого відключення. В іншому випадку відповідь на спосіб найшвидшого відключення полягатиме в тому, щоб вирвати шнур живлення.
harrymc

1
У деяких версіях синтаксис інший. "вимкнення судо -g0 -y -i5" (Solaris). І звичайно, лише для ускладнення точне значення після "i" може бути різним для відключення в різних системах. Я вважаю, що це значення 0 для багатьох інших систем для відключення. Зітхнути. Ви повинні любити стандарти, так що на вибір!
Брайан Ноблеуч

14

Я не пропоную робити наступне, якщо вас не змушують дійсно особливі причини:

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

Це грубо, жорстоко, і це можна вважати близьким еквівалентом відключення шнура живлення ...

Правильний шлях є shutdown -h nowз sudoдо того, коли це необхідно.
Можливо, я повинен сказати законний спосіб ; див. нижче або краще tl; dr.


Ще кілька слів , ака історія, глава I
На початку була init, і це буде до самого кінця.

Весь Linux залежить від люблячої турботи про init [ 1 ] [ 2 ] . Незважаючи на це і не без певної кількості невдячності, був час, коли добрий користувач корінних ресурсів Господа може зрадити цю любов і раптом killпорушити її з непорушним ( -9) порядком.
( Книга Етикету призначає графам, герцогам та маркізам, щоб користувачі зверталися до а sudo).

Тоді деякі чарівники зробили шарм для захисту ініта (із Книги man 2 init)

Єдиними сигналами, які можуть бути надіслані до ідентифікатора обробки 1, процесу init, є ті, для яких init явно встановив обробники сигналів. Це робиться для того, щоб система не була зруйнована випадково.

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

Це працює, тому що init є першим запущеним процесом і приймає PID номер 1 [ 2b ] .

Це небезпечно, нерозумно, і ви вважаєте, що це вісник поганої прикмети та прокляття, але якщо ви не можете матеріально покласти руки та відключити її від мережі ...

Прокляття : воно не запише в журнал, воно не вб'є всі процеси і не чекатиме їх закінчення, не буде писати на жорсткому диску належним чином оновлення вкладок, а також не відключить файлові системи; навіть не заперечуйте, що це збереже параметри графічних вікон та історій оболонок, а також багатьох інших за межами нашої уяви ... як ми говорили, близький еквівалент відключення шнура живлення або батареї, якщо ноутбук.


Правильний шлях
"Non nobis, Domine, non nobis, sed nomini tuo da gloriam.", Девіз рицарів тамплієрів. Законний (правильний) спосіб полягає у використанні [ 3 ]
shutdown

sudo shutdown -h now

завершення роботи системи забезпечує безпечне збиття системи. Усі зареєстровані користувачі отримують сповіщення про те, що система виходить з ладу і ...

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


Ще кілька слів , ака історія, глава II
Колись із неба над людьми Unix відчувались логічні кроки:

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

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

Тепер, коли все здавалося ясним і затишним для всіх, чутки стверджують , [ 7 ] , що в злочинному світі в Systemd набір інструментів [ 8 ] революція була виконана залишивши не знають всю надземним . Завдяки армії зворотних можливостей сумісності ми зовсім не помітили, що перезавантаження, переключення, зупинка [ 6 ] і навіть telinit [ 9 ] та вимкнення [ 3 ] вже обмежені до нового king 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

Якщо ви знаходитесь в системі чи ні, ви повинні мати змогу зупинити комп’ютер, не використовуючи всі правильні процедури shudown (і так швидше):

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

    При виклику з --force або при запуску рівня 0 або 6 цей інструмент викликає сам виклик перезавантаження (2) (з переданим аргументом REBOOTCOMMAND) і безпосередньо перезавантажує систему .

    В іншому випадку це просто викликає інструмент shutdown (8) з відповідними аргументами, не передаючи аргумент REBOOTCOMMAND.

    -f, --force
    Не викликає відключення (8), а замість цього виконує дійсні дії, яких ви очікували б від імені .

  2. Крім того, ви можете використовувати telinit [ 2b ] (або initбезпосередньо)

    sudo telinit 0    # or 6
    

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

  3. Під systemd ви можете використовувати нерозумно подвійний варіант --force --force

    systemctl --force --force poweroff  
    

    Читання з посібника systemctl [ 10 ]

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

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


9

Ви можете вимкнути машину негайно, не синхронізуючи диски, написавши "o" в / proc / sysrq-тригер як root.

Як сценарій оболонки це виглядало б приблизно так

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

Якщо у вас є дозволи на / proc / sysrq-триггер, вам не потрібно вмикати його через sysctl. Цей варіант впливає лише на запуск клавіатури.

Я не рекомендую робити це на комп'ютері з будь-якою файловою системою, яку ви хочете прочитати пізніше.

Я використовую це в Google Compute Engine, щоб забити шаблонні екземпляри безпосередньо перед десятихвилинною позначкою, щоб досягти максимальної економічності кластерних завдань, це чудово працює.


5
Це найкраща відповідь на це питання. ОП чітко заявляє, що хоче вимкнути систему аналогічно, як якщо б вимкнені електроживлення, вони не переймаються пошкодженнями або "роблять це належним чином". Я не розумію, чому ніхто цього не може зрозуміти.
Петро

1
bзамість oперезавантаження (актуально, оскільки питання було оновлено).
Каміль Маціоровський


5
poweroff

Це має працювати на найбільш поширених дистрибутивах. На відміну від shutdown, у багатьох системах ви можете виконати це як звичайний користувач (не потрібно судо).

Редагувати: подальше читання:


3

З іншого веб-сайту SE:

Alt+ SysRq+ B- це миттєве перезавантаження, а Alt+ SysRq+ O- миттєве відключення.


Довідка: Тут


2
здається, ви пропустили посилання і цитуєте свою відповідь, тоді я поверну свій голос
Франциско Тапія

Це оригінальна відповідь: askubuntu.com/a/56072
cst1992

2

Утримуйте клавішу живлення близько 4 секунд, це досить швидко.


1
Якщо це зробити, перевернути перемикач живлення насправді швидше;)
Gnoupi

Це те саме, що і будь-який інший метод відключення, якщо припустити, що ОС працює з управлінням живленням.
harrymc

1
Якщо ви насправді не можете зачекати кілька секунд і збираєтеся вбити потужність, використовуйте файлову систему журналу типу ext3 / ext4, щоб ви не втратили стільки даних через неписані записи.
КарлФ

Якщо не шукати непрограмного / непрограмного способу виконання відключення, то в іншому випадку пропозиція @Gnoupi - це набагато швидше. ;)
Усман

2

У деяких дистрибутивах Linux вимикання пропонує опцію -n. (Див. Вимкнення людини ). Деякі дистрибутиви (наприклад, ubuntu, який використовує upstart замість sysvinit), проте не підтримують його прапор, і цей прапор (як можна дізнатися на сторінці сторінки) не без ризику. Хоча я використовую це протягом багатьох років (на своєму ноутбуці мені не байдуже, що всі демони закінчуються належним чином, просто хочеться, щоб усе було вбито, і мій дисковий кеш промився) (це швидше, ніж звичайне відключення, і безпечніше, ніж витягування підключити (і друзів)). Ви можете побачити, чи це вирішує вашу проблему.


2

Я використовував цей невеликий сценарій, щоб вимкнути систему. Насправді це використовується для сварки на машині "прототипування": "Ей, чувак, давайте подивимося, що це дивовижно. ШШ!"

#!/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' to sysrq-trigger: write 's' не заблокує виконання сценарію, тому після запиту кешу записати на диск, машина негайно вимкнеться. На відміну від syncкоманди, syncповернеться після завершення процесу написання. Так виконання сценарію буде заблоковано, поки не буде виконано промивання кешу.


1
Чи не варто вам "перед" у? Також, як цикл:SEQUENCE=(s u o); for i in "${SEQUENCE[@]}"; do sleep 3; printf "${i}" > /proc/sysrq-trigger; done
Quotion Que
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.