Come spegnere immediatamente un computer (da 1 a 5 secondi) senza utilizzare un interruttore / presa fisica?


17

Esiste un comando / programma tramite il quale posso spegnere immediatamente il mio sistema (da 1 a 5 secondi)?

Aggiornamento (2015): grazie a coloro che hanno suggerito di spegnere utilizzando la presa di corrente. : D

Aggiornamento (2016): @technophile mi ha suggerito di aggiungere alcune informazioni alla domanda che descrivono la natura del problema, principalmente quale scenario stavo cercando di risolvere. Ecco lo scenario per il quale questa domanda è stata posta alcuni anni fa.

Stavamo costruendo un sistema da implementare in spazi pubblici come (aeroporti, hotel ecc.). Le persone possono utilizzare quel sistema per navigare in Internet, controllare la propria e-mail o persino prenotazioni ecc. Usando le loro carte di credito. La creazione del sistema stava assicurando che un secondo utente non potesse in alcun modo ottenere informazioni (e-mail, carte di credito) dell'utente precedente di quel sistema anche se in qualche modo i software di keylogger fossero installati. Come si è assicurato il sistema? Bene, i dettagli non possono essere condivisi perché non sono informazioni pubbliche. ma abbiamo sviluppato un modo per avere sempre un nuovo sistema operativo (come se fosse stato appena installato) per un nuovo utente del sistema. L'unico problema era che dovevamo spegnere la macchina e riaccenderla non appena il primo utente lascia la macchina.

E volevo che lo spegnimento fosse istantaneamente veloce (- ecco perché la domanda) e anche il prossimo avvio sarebbe stato molto veloce per il quale ho cercato e provato un gran numero di distribuzioni Linux da Damn Small Linux a Slackware a Debian ecc. Ma questo è un storia separata.


1
Poiché il codice più veloce è quello che non viene eseguito, direi che il modo più veloce per arrestare un sistema non è quello di accenderlo. Spiega cosa stai cercando di ottenere se hai bisogno di una risposta specifica.
Dmitry Grigoryev il

2
@ Sam152 quale parete?
choc,

Volevi anche specificare "senza danneggiare il mio sistema" o non è un problema?
Technophile,

Naturalmente, il Technophile non è un danno permanente al mio sistema. Ma cosa hai in mente?
choc

Il mio scopo è di chiarire cosa stai chiedendo e cosa stai cercando di fare. Lavoro in elettronica; significa "istantaneamente" 1 secondo? 1ms? 1us? 1ns? Sei semplicemente impaziente o c'è qualche bisogno specifico? Quali sono le conseguenze di un tempo di spegnimento (ad esempio) di 6 secondi? Sto lavorando con un sistema incorporato che corrompe la sua scheda SD se l'arresto supera i 5 secondi quando si tiene premuto il pulsante di accensione. Cosa fai?
Technophile,

Risposte:


32
sudo shutdown -h now

9
Ciò non arresterebbe immediatamente un sistema . ;)
Marcel Korpel,

14
@Marcel Korpel: all'istante come uno dovrebbe fare senza danneggiare il suo sistema;)
Felix

@Felix - Continuo a sentire che Linux è un sistema molto robusto e non è in grado di gestire gli stessi "riavvii duri" di Windows? Sarebbe sorprendente;)
Gnoupi,

2
@Gnoupi: nessun sistema operativo può essere creato senza qualche vulnerabilità all'arresto improvviso. Altrimenti, la risposta al metodo di spegnimento più veloce sarebbe quella di strappare il cavo di alimentazione.
harrymc,

1
Alcune versioni la sintassi è diversa. "sudo shutdown -g0 -y -i5" (Solaris). E, naturalmente, solo per renderlo difficile, il valore esatto che segue "i" può essere diverso per l'arresto su sistemi diversi. Credo che sia 0 su molti altri sistemi per l'arresto. Sospiro. Devo amare gli standard, così tanti tra cui scegliere!
Brian Knoblauch,

14

Non consiglio di fare quanto segue se non sei costretto da ragioni davvero speciali:

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

È ruvido, brutale e può essere considerato un equivalente vicino di scollegare il cavo di alimentazione ...

Il modo corretto è shutdown -h nowcon sudoprima quando necessario.
Forse dovrei dire in modo lecito ; vedi sotto o meglio tl; dr.


Qualche parola in più , alias La storia, Capitolo I
All'inizio c'era l'init e sarà fino alla fine.

L'intero Linux dipende dalla cura amorevole di init [ 1 ] [ 2 ] . Tuttavia e non senza una certa dose di ingrato, c'è stato un tempo in cui il buon utente root di Dio può tradire questo amore e improvvisamente killiniziare con un -9ordine incontrovertibile ( ).
( Il Libro dell'etichetta prescrive agli utenti di conteggi, duchi e marchesi di invocare prima di a sudo).

Quindi alcuni maghi hanno fatto un incantesimo per proteggere init (dal Libro di man 2 init)

Gli unici segnali che possono essere inviati all'ID processo 1, il processo init, sono quelli per i quali init ha esplicitamente installato gestori di segnali. Questo viene fatto per garantire che il sistema non venga accidentalmente disattivato.

(Le nostre spie segnalano [ U1 ] che init gestirà 1 HUP 6 ABRT 11 SEGV 15 TERM 30 PWR 2 INT 10 USR1 14 ALRM 17 CHLD 32)
Quindi il buon utente root di Lord impara le notizie e cambia il comando kill -ABRT 1o kill -SEGV 1che di solito genera un comando panico del kernel e un dump principale.

Funziona perché init è il primo processo da eseguire e accetta il numero PID 1 [ 2b ] .

Questo non è sicuro, non è saggio e senti che è araldo di cattivo presagio e una maledizione, ma se non puoi materialmente mettere le mani su e staccare la spina ...

La maledizione : non scriverà sul registro, non ucciderà tutti i processi e attenderà la loro fine, non scriverà sull'HDD aggiornando correttamente gli inode né smonterà i filesystem; non importa nemmeno che salverà le opzioni delle finestre grafiche e delle storie delle shell, e molte altre oltre la nostra immaginazione ... come abbiamo detto un equivalente equivalente di scollegare l'accordo di alimentazione o la batteria se un laptop.


Il modo corretto
"Non nobis, Domine, non nobis, sed nomini tuo da gloriam.", Motto dei cavalieri templari.
Il modo lecito (corretto) è usare shutdown[ 3 ]

sudo shutdown -h now

lo spegnimento prevede che il sistema possa essere arrestato in modo sicuro. Tutti gli utenti che hanno effettuato l'accesso vengono informati che il sistema non funziona e ...

ma con -h nowloro non avranno abbastanza tempo per fare così tanto ...


Qualche parola in più , alias The story, Chapter II
C'erano una volta alcuni passi logici percepiti dal cielo sulle persone unix:

Una volta che i processi di sistema sono stati interrotti e i filesystem sono stati smontati, il sistema si arresta / si spegne o si riavvia automaticamente. Questo viene fatto usando il comando halt o reboot, che sincronizza le modifiche ai dischi e quindi esegue l'arresto / spegnimento effettivo o riavvia. [ 4 ]

In effetti, al giorno d'oggi, non ci fidiamo più dell'esistenza dei tre Moirai [ 5 ] del mondo Linux , reboot, poweroffe halt[ 6 ] : la scienza moderna della ls -l $(which poweroff halt reboot)e quella di man reboot, spread nuova luce su questo periodo oscuro e ci rivelano che esiste solo un vero comando che analizza tutte le loro opzioni in modo che siamo finalmente liberi di chiedere azioni in contraddizione con i nomi dei loro comandi! ( halt -po reboot -pper poweroff, shutdown -rper reboot...)

Ora che tutto sembra essere chiaro e accogliente per tutti, le voci sostengono [ 7 ] che negli inferi del set di strumenti di sistema [ 8 ] sia stata eseguita una rivoluzione lasciando inconsapevole l'intero mondo . Grazie a un esercito di shim di retrocompatibilità non abbiamo notato affatto che il riavvio, lo spegnimento, l'arresto [ 6 ] e persino il telinit [ 9 ] e l'arresto [ 3 ] sono già tutti legati al nuovo re systemctl [ 10 ]. Per favore, ascolta l'intera storia dalla voce originale di JdeBP The Bard [ 9 ] perché non ho più respiro.

Se sei un seguace del culto di Ubuntu potresti rimanere a conoscenza per un po 'di tutte queste affermazioni [ 11 ] .


La Terra di Mezzo di halt -f, init, telinit, systemctl
Ricerca per soluzione più veloce di quella giusta ma allo stesso modo saggio.

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

Che tu sia sotto systemd o no, dovresti essere in grado di fermare il computer senza invocare tutte le corrette procedure di shudown (e molto più velocemente):

  1. halt -f: specifica l'opzione-f (si noti che è necessario -fevitare la procedura di spegnimento) con il comando sopra, con sudo poweroff -fo forse anche con sudo reboot -f -h. In effetti possiamo leggere da man reboot(e equivalenti) sulla necessità di specificare l'opzione -fper evitare di chiamare l'arresto:

    Quando viene chiamato con --force o in runlevel 0 o 6, questo strumento richiama la chiamata di sistema reboot (2) stessa (con l'argomento REBOOTCOMMAND passato) e riavvia direttamente il sistema .

    In caso contrario, questo invoca semplicemente lo strumento shutdown (8) con gli argomenti appropriati senza passare l'argomento REBOOTCOMMAND.

    -f, --force
    Non invoca l'arresto (8) e invece esegue l'azione effettiva che ci si aspetterebbe dal nome .

  2. Inoltre puoi usare telinit [ 2b ] (oinitdirettamente)

    sudo telinit 0    # or 6
    

    dire a init di cambiare il runlevel ... ma se è così, perché non ucciderlo direttamente?

  3. Sotto systemd puoi usare l'opzione doppia poco saggia --force --force

    systemctl --force --force poweroff  
    

    Lettura dal manuale di systemctl [ 10 ]

    -f, --force
    Se utilizzato con abilita, sovrascrive eventuali collegamenti simbolici in conflitto esistenti.
    Quando utilizzato con halt, poweroff,reboot o kexec, eseguire l'operazione selezionata senza spegnere tutte le unità. Tuttavia, tutti i processi verranno eliminati forzatamente e tutti i file system verranno smontati o rimontati in sola lettura. Questa è quindi un'opzione drastica ma relativamente sicura per richiedere un riavvio immediato. Se --force viene specificato due volte per queste operazioni, verranno eseguite immediatamente senza interrompere alcun processo o smontare alcun file system. Avvertenza: specificare --force due volte con una qualsiasi di queste operazioni potrebbe causare la perdita di dati.

Ps> Prendi ispirazione dalle varianti della coda JdeBP The Bard [ 7 ] .


9

È possibile spegnere immediatamente la macchina senza sincronizzare i dischi scrivendo "o" su / proc / sysrq-trigger come root.

Come uno script shell sembrerebbe qualcosa di simile

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

Se si dispone delle autorizzazioni per / proc / sysrq-trigger, non è necessario abilitarlo tramite sysctl. Questa opzione ha effetto solo sul trigger da tastiera.

Non consiglio di farlo su una macchina con qualsiasi filesystem che si desidera leggere in seguito.

Lo uso su Google Compute Engine per macellare istanze basate su tempistiche proprio prima dei dieci minuti per massimizzare la convenienza dei lavori di cluster, funziona alla grande.


5
Questa è la migliore risposta a questa domanda. OP afferma chiaramente che desidera arrestare il sistema in modo simile a quanto scollegato dall'alimentazione, a loro non importa del danno o "farlo correttamente". Non capisco perché nessuno possa capirlo.
Petr,

1
binvece di oriavviare (rilevante dal momento che la domanda è stata aggiornata).
Kamil Maciorowski il




2

Tieni premuto il tasto di accensione per circa 4 secondi, è abbastanza veloce.


1
In tal caso, premere l'interruttore di accensione in realtà è più veloce;)
Gnoupi,

È lo stesso di qualsiasi altro metodo di spegnimento, supponendo che il sistema operativo esegua la gestione dell'alimentazione.
harrymc,

1
Se in realtà non puoi aspettare qualche secondo e stai per uccidere il potere, usa un filesystem journaling come ext3 / ext4 in modo da non perdere tanti dati a causa di scritture non scritte.
CarlF,

Non cercare un modo non programmatico / non software per eseguire l'arresto altrimenti il ​​suggerimento di @Gnoupi è molto più veloce. ;)
choc,

2

Su alcune distribuzioni di Linux, shutdown offre l'opzione -n. (Vedi spegnimento uomo ). Alcune distribuzioni (come Ubuntu che utilizza upstart invece di sysvinit) non supportano la sua bandiera, e questa bandiera è (come si può imparare dalla manpage) non senza rischi. Sebbene lo stia usando da anni (sul mio laptop non mi interessa che tutti i demoni vengano terminati correttamente, vuole solo che tutto venga ucciso e che la mia discache venga scaricata) (è più veloce di un normale arresto e più sicuro che tirare il plug (e amici)). Potresti vedere se questo risolve il tuo problema.


2

Ho usato questo piccolo script per spegnere il sistema. In realtà lo ha usato per uno scherzo su una macchina di "prototipazione": "Ehi amico, vediamo cosa fa quel fantastico .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.

(Questo script imita lo stesso del colpire Alt+ SysRq+ u/ s/ ocome spiegato in precedenza.) Naturalmente non causo una chiusura anomala del sistema (le tabelle mysql, ecc. Potrebbero andare in crash), quindi utilizzare solo su macchine fittizie. Nota: la sincronizzazione potrebbe richiedere del tempo. Ho visto che se il sistema ha molta memoria libera (per la cache) e copi un sacco di file su una pen drive, la sincronizzazione richiede più tempo, ma lo consiglio anche per uno scherzo.

Modifica: è meglio usare syncinvece di scrivere 's' su sysrq-trigger: writing 's' non bloccherà l'esecuzione dello script, quindi dopo aver richiesto la scrittura della cache sul disco, la macchina si spegnerà immediatamente. Contrariamente al synccomando, synctornerà dopo aver completato il processo di scrittura. Pertanto, l'esecuzione dello script verrà bloccata fino al completamento dello svuotamento della cache.


1
Non dovresti 'prima di' u '? Inoltre, come un ciclo:SEQUENCE=(s u o); for i in "${SEQUENCE[@]}"; do sleep 3; printf "${i}" > /proc/sysrq-trigger; done
Que Quotion,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.