Jak natychmiast wyłączyć komputer (od 1 do 5 sekund) bez użycia fizycznego przełącznika / gniazda?

17

Czy jest jakieś polecenie / program, za pomocą którego mogę natychmiast wyłączyć system (od 1 do 5 sekund)?

Aktualizacja (2015): Dziękuję tym, którzy zasugerowali wyłączenie przy użyciu gniazdka elektrycznego. :RE

Aktualizacja (2016): @technophile zasugerował, że powinienem dodać trochę informacji do pytania opisującego naturę problemu - głównie tego, który scenariusz próbowałem rozwiązać. Oto scenariusz, dla którego to pytanie zostało zadane kilka lat temu.

Budowaliśmy system do wdrożenia w miejscach publicznych, takich jak (lotniska, hotele itp.). Ludzie mogą korzystać z tego systemu do surfowania po Internecie, sprawdzania poczty elektronicznej, a nawet rezerwacji itp. Za pomocą kart kredytowych. Zbudowany system upewniał się, że drugi użytkownik nie może w żaden sposób uzyskać informacji (e-mail, karty kredytowe) poprzedniego użytkownika tego systemu, nawet jeśli oprogramowanie typu keyloggery zostanie w jakiś sposób zainstalowane. Jak system to upewniał? Cóż, szczegółów nie można udostępnić, ponieważ nie są to informacje publiczne. ale opracowaliśmy sposób, aby zawsze mieć nowy system operacyjny (tak jakby był nowo zainstalowany) dla nowego użytkownika systemu. Jedynym problemem było to, że musieliśmy wyłączyć maszynę i uruchomić ją ponownie, gdy tylko pierwszy użytkownik opuści maszynę.

I chciałem, aby to zamknięcie było natychmiastowe (to dlatego pytanie), a następne uruchomienie również było bardzo szybkie, dla którego zbadałem i wypróbowałem dużą liczbę dystrybucji Linuksa od Damn Small Linux do Slackware do Debiana itp., Ale to jest osobna historia.

czekolada
źródło
1
Ponieważ najszybszy kod nie uruchamia się, powiedziałbym, że najszybszym sposobem zamknięcia systemu jest nie włączanie go. Wyjaśnij, co próbujesz osiągnąć, jeśli potrzebujesz konkretnej odpowiedzi.
Dmitrij Grigoriew
2
@ Sam152 która ściana?
choc
Czy chcesz również określić „bez uszkadzania mojego systemu”, czy to nie stanowi problemu?
Technophile
@Technofil nie jest oczywiście trwałym uszkodzeniem mojego systemu. Ale co masz na myśli?
choc
Moim celem jest wyjaśnienie, o co prosisz i co próbujesz zrobić. Pracuję w elektronice; oznacza „natychmiast” oznacza 1 sekundę? 1ms? 1us? 1ns? Czy jesteś po prostu niecierpliwy, czy jest jakaś konkretna potrzeba? Jakie są konsekwencje (na przykład) 6-sekundowego czasu wyłączenia? Pracuję z wbudowanym systemem, który uszkadza kartę SD, jeśli wyłączenie przekracza 5 sekund, gdy przycisk zasilania jest wciśnięty. Co robisz?
Technophile

Odpowiedzi:

32
sudo shutdown -h now
Felix
źródło
9
To nie zamknęłoby systemu natychmiast . ;)
Marcel Korpel
14
@Marcel Korpel: Tak szybko, jak należy to zrobić, nie uszkadzając jego systemu;)
Felix
@ Felix - Ciągle słyszę, że Linux jest bardzo solidnym systemem i nie radzi sobie z takimi samymi „twardymi restartami”, jak mój system Windows? Byłoby zaskakujące;)
Gnoupi
2
@Gnoupi: Żaden system operacyjny nie może zostać zbudowany bez pewnej podatności na nagłe zamknięcie. W przeciwnym razie odpowiedzią na najszybszą metodę zamknięcia byłoby szarpnięcie przewodu zasilającego.
harrymc
1
W niektórych wersjach składnia jest inna. „sudo shutdown -g0 -y -i5” (Solaris). I oczywiście, aby to utrudnić, dokładna wartość po „i” może być różna dla zamykania w różnych systemach. Uważam, że to zero w wielu innych systemach do zamknięcia. Westchnienie. Uwielbiam standardy, tak wiele do wyboru!
Brian Knoblauch
14

Nie sugeruję wykonywania następujących czynności, jeśli nie jesteś zmuszony z naprawdę szczególnych powodów:

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

Jest szorstki, brutalny i można go uznać za ścisły odpowiednik odłączenia przewodu zasilającego ...

Poprawny sposób jest shutdown -h nowz sudoprzed gdy są potrzebne.
Może powinienem powiedzieć w sposób zgodny z prawem ; patrz poniżej lub lepiej tl; dr.


Niektóre słowa więcej , aka historii, Rozdział I
Na początku było init i będzie aż do samego końca.

Cały Linux zależy od miłości i troski o pliku init [ 1 ] [ 2 ] . Niemniej jednak i nie bez pewnej niewdzięczności był czas, w którym dobry użytkownik root może zdradzić tę miłość i nagle killzainicjować z niezaprzeczalną ( -9) kolejnością.
( Księga etykiety nakazuje hrabiom, książętom i markizom wywoływać użytkowników przed a sudo).

Następnie niektórzy czarodzieje rzucili urok, aby chronić init (z Księgi man 2 init)

Jedynymi sygnałami, które można wysłać do ID procesu 1, procesu init, są te, dla których init wyraźnie zainstalował procedury obsługi sygnałów. Ma to na celu zapewnienie, że system nie zostanie przypadkowo wyłączony.

(Nasz raport szpiegów [ U1 ], że init będzie obsługiwał 1 HUP 6 ABRT 11 SEGV 15 TERM 30 PWR 2 INT 10 USR1 14 ALRM 17 CHLD 32)
Tak więc dobry użytkownik root uczy się wiadomości i zmienia polecenie kill -ABRT 1lub kill -SEGV 1zwykle generuje panika jądra i zrzut rdzenia.

Działa, ponieważ init jest pierwszym uruchomionym procesem i przyjmuje numer PID 1 [ 2b ] .

Jest to niebezpieczne, nierozsądne i czujesz, że to zwiastun złego omenu i klątwy, ale jeśli nie możesz materialnie położyć rąk i odłączyć go od sieci ...

Klątwa : nie zapisze w dzienniku, nie zabije wszystkich procesów i czeka na ich zakończenie, nie zapisze na dysku twardym poprawnie aktualizując i-węzły, ani nie odmontuje systemów plików; nawet nie mam nic przeciwko, że zapisze opcje okien graficznych i historii powłok oraz wiele innych poza naszą wyobraźnią ... jak powiedzieliśmy bliski odpowiednik odłączenia przewodu zasilającego lub baterii w przypadku laptopa.


Prawidłowy sposób
„Non nobis, Domine, non nobis, sed nomini tuo da gloriam.”, Motto templariuszy. Prawem (poprawne) sposobem jest użycie [ 3 ]
shutdown

sudo shutdown -h now

Shutdown zapewnia bezpieczne wyłączenie systemu. Wszyscy zalogowani użytkownicy są powiadamiani o awarii systemu i ...

ale przy tym -h nownie będą mieli wystarczająco dużo czasu, aby zrobić tyle ...


Kilka słów więcej , aka Historia, rozdział II
Pewnego razu z nieba poczuli się logiczni ludzie nad ludźmi uniksowymi:

Po zabiciu procesów systemowych i odmontowaniu systemów plików system zatrzymuje się / wyłącza lub automatycznie uruchamia się ponownie. Odbywa się to za pomocą polecenia halt lub reboot, które synchronizuje zmiany na dyskach, a następnie wykonuje faktyczne zatrzymanie / wyłączenie zasilania lub ponowne uruchomienie. [ 4 ]

Rzeczywiście, w dzisiejszych czasach, nie ufa bardziej w istnienie trzech Moirai [ 5 ] w świecie Linuksa , reboot, poweroffi halt[ 6 ] : the modern science of ls -l $(which poweroff halt reboot)a jednym z man rebootspready nowe światło na ten wiek ciemności i ujawnić nam że istnieje tylko jedno prawdziwe polecenie, które analizuje wszystkie opcje, abyśmy mogli wreszcie poprosić o działania sprzeczne z nazwami ich poleceń! ( halt -plub reboot -pdla poweroff, shutdown -rdla reboot...)

Teraz, gdy wszystko wydawało się jasne i przytulne dla wszystkich, pogłoski twierdzą, [ 7 ] , że w półświatku od Systemd zestawu narzędzi [ 8 ] rewolucja przeprowadzono pozostawiając nieświadomy całego Nadświecie . Dzięki armii wstecznych podkładek kompatybilności w ogóle nie zauważyliśmy, że ponowne uruchomienie, wyłączenie, zatrzymanie [ 6 ], a nawet telinit [ 9 ] i wyłączenie [ 3 ] są już powiązane z nowym królem systemctl [ 10 ]. Posłuchaj całej historii oryginalnego głosu JdeBP The Bard [ 9 ], ponieważ nie mam już tchu.

Jeśli jesteś wyznawcami kultu Ubuntu, możesz nadal być świadomy tych wszystkich roszczeń [ 11 ] .


Bliski Ziemi halt -f, init, telinit, systemctl
Poszukiwanie rozwiązania szybciej niż poprawny, ale także mądry.

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

Jeśli masz system, czy nie, powinieneś być w stanie zatrzymać komputer bez wywoływania wszystkich poprawnych procedur pokazowych (i tak szybciej):

  1. halt -f: określenie opcji-f (pamiętaj, że musisz -funikać procedury zamykania) za pomocą powyższego polecenia, za pomocą, sudo poweroff -fa może nawet za pomocą sudo reboot -f -h. Rzeczywiście możemy przeczytać man reboot(i odpowiedniki) o potrzebie określenia opcji -funikania wywoływania zamykania:

    Po wywołaniu z --force lub gdy w Tryb 0 albo 6, narzędzie to powołuje się na ponownym uruchomieniu (2) sam połączenia systemu (z argumentem REBOOTCOMMAND przekazywane) i bezpośrednio ponownym uruchomieniu systemu .

    W przeciwnym razie po prostu wywołuje narzędzie shutdown (8) z odpowiednimi argumentami bez przekazywania argumentu REBOOTCOMMAND.

    -f, --force
    Nie wywołuje shutdown (8), a zamiast tego wykonuje rzeczywistą akcję, jakiej można oczekiwać od nazwy .

  2. Ponadto możesz użyć telinit [ 2b ] (lub initbezpośrednio)

    sudo telinit 0    # or 6
    

    powiedzieć initowi, żeby zmienił poziom działania ... ale jeśli tak, to dlaczego nie zabić go bezpośrednio?

  3. W systemied możesz użyć niemądrej podwójnej opcji --force --force

    systemctl --force --force poweroff  
    

    Czytanie z podręcznika systemctl [ 10 ]

    -f, --force
    W przypadku użycia z włączeniem zastąp wszystkie istniejące sprzeczne dowiązania symboliczne.
    Kiedy stosować halt, poweroff,reboot lub kexec, wykonać wybraną operację bez wyłączania wszystkich jednostek. Jednak wszystkie procesy zostaną zabite na siłę, a wszystkie systemy plików zostaną odmontowane lub ponownie zamontowane tylko do odczytu. Jest to zatem drastyczna, ale stosunkowo bezpieczna opcja żądania natychmiastowego ponownego uruchomienia. Jeśli --force zostanie określone dwukrotnie dla tych operacji, zostaną one wykonane natychmiast, bez przerywania procesów lub odmontowywania systemów plików. Ostrzeżenie: dwukrotne określenie opcji --force w przypadku dowolnej z tych operacji może spowodować utratę danych.

Ps> czerp inspirację na temat wariantów z ogona JdeBP The Bard [ 7 ] .

Hastur
źródło
9

Możesz natychmiast wyłączyć komputer bez synchronizacji dysków, pisząc „o” w katalogu / proc / sysrq-trigger jako root.

Wyglądałby jak skrypt powłoki

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

Jeśli masz uprawnienia do / proc / sysrq-trigger, nie musisz włączać go przez sysctl. Ta opcja wpływa tylko na wyzwalanie za pomocą klawiatury.

Nie polecam robić tego na komputerze z dowolnym systemem plików, który chcesz przeczytać później.

Używam tego w Google Compute Engine do uboju szablonów tuż przed upływem dziesięciu minut, aby zmaksymalizować opłacalność zadań w klastrze, działa świetnie.

Aaron Muir Hamilton
źródło
5
To najlepsza odpowiedź na to pytanie. OP wyraźnie stwierdza, że ​​chce zamknąć system w podobny sposób, jakby odłączony od zasilania, nie obchodzi ich uszkodzenie lub „robienie tego poprawnie”. Nie rozumiem, dlaczego nikt tego nie rozumie.
Petr
1
bzamiast orestartu (istotne, ponieważ pytanie zostało zaktualizowane).
Kamil Maciorowski
7

Musisz użyć kombinacji klawiszy Magic SysRqREISUB .

Powtórz za mną: „ Wychowywanie słoni jest tak nudne ...

jedenaście81
źródło
2
Nie. REISUB uruchomi go ponownie. REISUO zostanie zamknięte. Lub po prostu O.
Benoit
3

Zaczerpnięte z innej strony SE:

Alt+ SysRq+ Bto natychmiastowe ponowne uruchomienie, a Alt+ SysRq+ Oto natychmiastowe zamknięcie.


Referencja: tutaj

cst1992
źródło
2
wydaje pominięcia odniesienia i zacytować odpowiedź, wtedy będę odwrócić mój głos
Francisco Tapia
To jest oryginalna odpowiedź: askubuntu.com/a/56072
cst1992
2

Przytrzymaj klawisz zasilania przez około 4 sekundy, jest dość szybki.

Camilo Martin
źródło
1
W takim przypadku przestawienie przełącznika zasilania jest w rzeczywistości szybsze;)
Gnoupi
Jest to to samo, co każda inna metoda zamykania, zakładając, że system operacyjny zarządza energią.
harrymc
1
Jeśli nie możesz poczekać kilku sekund i zamierzasz zabić moc, użyj systemu plików kronikowania, takiego jak ext3 / ext4, aby nie stracić tylu danych z powodu niepisanych zapisów.
CarlF
Nie szukanie nieprogramowego / nieprogramowego sposobu przeprowadzenia zamykania, w przeciwnym razie sugestia @Gnoupi jest znacznie szybsza. ;)
choc
2

W niektórych dystrybucjach Linuksa zamknięcie oferuje opcję -n. (Zobacz zamknięcie człowieka ). Niektóre dystrybucje (takie jak ubuntu, które używają upstart zamiast sysvinit) nie obsługują jednak jego flagi, a flagi te (jak można dowiedzieć się z manpage) nie są pozbawione ryzyka. Chociaż używam tego od lat (na moim laptopie nie dbam o to, aby wszystkie demony zostały poprawnie zakończone, po prostu chcę, aby wszystko zabito, a pamięć dyskowa została opróżniona) (jest szybsze niż zwykłe zamykanie i bezpieczniejsze niż ciągnięcie wtyczka (i przyjaciele)). Możesz zobaczyć, czy to rozwiąże twój problem.

amo-ej1
źródło
2

Użyłem tego małego skryptu, aby wyłączyć system. W rzeczywistości jest to używane do dowcipu na maszynie do „prototypowania”: „Hej, stary, zobaczmy, co robi ten niesamowity .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.

(Ten skrypt naśladuje to samo, co naciśnięcie Alt+ SysRq+ u/ s/, ojak wcześniej wyjaśniono.) Oczywiście nie spowoduję nieprawidłowego zakończenia systemu (tabele mysql itp. Mogą ulec awarii), więc używaj tylko na maszynach zastępczych. Uwaga: synchronizacja może trochę potrwać. Widziałem, że jeśli system ma dużo wolnej pamięci (na pamięć podręczną), a ty skopiujesz kilka plików na pendrive, synchronizacja zajmuje więcej czasu, ale polecam to nawet dla dowcipu.

Edycja: Lepiej jest używać synczamiast zapisywania „do” sysrq-trigger: pisanie „nie” nie blokuje wykonywania skryptu, więc po zażądaniu zapisania pamięci podręcznej na dysku, urządzenie natychmiast się wyłączy. W przeciwieństwie do syncpolecenia, syncpowróci po zakończeniu procesu pisania. Wykonywanie skryptu będzie blokowane, dopóki nie zostanie zakończone opróżnianie pamięci podręcznej.

Dankó Dávid
źródło
1
Czy nie powinieneś być przed tobą? Ponadto jako pętla:SEQUENCE=(s u o); for i in "${SEQUENCE[@]}"; do sleep 3; printf "${i}" > /proc/sysrq-trigger; done
Que Quotion