Como desligar um computador instantaneamente (1 a 5 segundos) sem usar um interruptor / soquete físico?


17

Existe algum comando / programa através do qual eu posso desligar meu sistema instantaneamente (1 a 5 segundos)?

Atualização (2015): Obrigado a quem sugeriu desligar usando a tomada. : D

Atualização (2016): o @technophile sugeriu que eu acrescentasse algumas informações à pergunta que descreve a natureza do problema - principalmente qual cenário eu estava tentando resolver. Aqui está o cenário para o qual essa pergunta foi feita há alguns anos.

Estávamos construindo um sistema para ser implantado em espaços públicos como (aeroportos, hotéis etc.). As pessoas podem usar esse sistema para navegar na Internet, verificar seus e-mails ou até fazer reservas etc. usando seus cartões de crédito. O sistema construído assegurava que um segundo usuário não pudesse obter informações (email, cartões de crédito) do usuário anterior desse sistema, mesmo que os softwares de keyloggers de alguma forma fossem instalados. Como o sistema estava se certificando disso? Bem, os detalhes não podem ser compartilhados porque não são informações públicas. mas desenvolvemos uma maneira de sempre ter um sistema operacional novo (como se tivesse sido instalado recentemente) para um novo usuário do sistema. O único problema foi que tivemos que desligar a máquina e trazê-la novamente assim que o primeiro usuário sair da máquina.

E eu queria que o desligamento fosse instantaneamente rápido (- é por isso que a pergunta) e a próxima inicialização também muito rápida, para as quais pesquisei e tentei um grande número de distribuições Linux, do Damn Small Linux ao Slackware, Debian etc. história separada.


11
Como o código mais rápido é o que não roda, eu diria que a maneira mais rápida de desligar um sistema é não ligá-lo. Explique o que você está tentando alcançar se precisar de uma resposta específica.
Dmitry Grigoryev

2
@ Sam152 qual parede?
Choc

Deseja também especificar "sem danificar meu sistema" ou isso não é uma preocupação?
Technophile

@ Technophile não é um dano permanente ao meu sistema, é claro. Mas o que você tem em mente?
choc

Meu objetivo é esclarecer o que você está perguntando e o que está tentando fazer. Eu trabalho em eletrônica; "instantaneamente" significa 1 segundo? 1ms? 1us? 1ns? Você é simplesmente impaciente ou há alguma necessidade específica? Quais são as conseqüências de um (por exemplo) tempo de desligamento de 6 segundos? Estou trabalhando com um sistema incorporado que corrompe seu cartão SD se o desligamento exceder 5 segundos quando o botão liga / desliga é pressionado. O que você está fazendo?
Technophile

Respostas:


32
sudo shutdown -h now

9
Isso não desligaria o sistema instantaneamente . ;)
Marcel Korpel

14
@Marcel Korpel: Como instantaneamente como se deve fazer sem danificar o seu sistema;)
Felix

@ Felix - Eu continuo ouvindo que o Linux é um sistema muito robusto e não pode lidar com as mesmas "reinicializações duras" que meu Windows suportou? Seria surpreendente;)
Gnoupi

2
@Gnoupi: Nenhum sistema operacional pode ser construído sem alguma vulnerabilidade ao desligamento abrupto. Caso contrário, a resposta para o método de desligamento mais rápido seria puxar o cabo de alimentação.
22910 harrymc

11
Em algumas versões, a sintaxe é diferente. "sudo shutdown -g0 -y -i5" (Solaris). E, é claro, apenas para dificultar, o valor exato a seguir a "i" pode ser diferente para o desligamento em diferentes sistemas. Acredito que seja 0 em muitos outros sistemas para desligamento. Suspiro. Tenho que amar os padrões, tantos para escolher!
22610 Brian 13:11

14

Eu não sugiro fazer o seguinte se você não for forçado por razões realmente especiais:

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

É áspero, brutal e pode ser considerado um equivalente próximo de desconectar o cabo de alimentação ...

A maneira correta é shutdown -h nowcom sudoantes quando necessário.
Talvez eu deva dizer da maneira legal ; veja abaixo ou melhor tl; dr.


Algumas palavras a mais , também conhecida como A história, Capítulo I
No começo era o init e será até o fim.

Todo o Linux depende do carinho de init [ 1 ] [ 2 ] . No entanto, e não sem uma certa quantidade de ingratidão, houve um tempo em que o bom usuário root do Lord pode trair esse amor e de repente killcomeçar com uma -9ordem incontestável ( ).
( O Livro de Etiqueta prescreve que usuários de contagens, duques e marquês invoquem antes de a sudo).

Então alguns bruxos fizeram um encanto para proteger init (do Livro de man 2 init)

Os únicos sinais que podem ser enviados para o processo ID 1, o processo init, são aqueles para os quais o init instalou explicitamente manipuladores de sinal. Isso é feito para garantir que o sistema não seja desativado acidentalmente.

(Nossos espiões relatam [ U1 ] que o init lidará com 1 HUP 6 ABRT 11 SEGV 15 TERM 30 PWR 2 INT 10 USR1 14 ALRM 17 CHLD 32)
Portanto, o bom usuário root do Lord aprende as notícias e altera o comando kill -ABRT 1ou, kill -SEGV 1geralmente, gera um pânico do kernel e um core dump.

Funciona porque o init é o primeiro processo a ser executado e leva o número PID 1 [ 2b ] .

Isso é inseguro, imprudente e você sente que é um arauto de mau presságio e uma maldição, mas se você não puder colocar as mãos materialmente e desconectá-lo ...

A maldição : não gravará no log, não matará todos os processos e aguardará seu término, não gravará no HDD atualizando adequadamente os inodes nem desmontará os sistemas de arquivos; nem se preocupe, isso salvará as opções das janelas gráficas e dos históricos de shell e muitas outras além da nossa imaginação ... como dissemos um equivalente próximo de desconectar o cabo de força ou a bateria de um laptop.


A maneira correta
"Non nobis, Domine, non nobis, sed nomini tuo da gloriam.", Lema dos cavaleiros templários.
A maneira legal (correta) é usar shutdown[ 3 ]

sudo shutdown -h now

O encerramento determina que o sistema seja desativado de maneira segura. Todos os usuários conectados são notificados de que o sistema está inoperante e ...

mas com -h noweles não terão tempo suficiente para fazer tanto ...


Algumas palavras a mais , também conhecida como A história, Capítulo II
Era uma vez alguns passos lógicos sentidos do céu sobre o povo unix:

Depois que os processos do sistema são eliminados e os sistemas de arquivos desmontados, o sistema pára / desliga ou reinicia automaticamente. Isso é feito usando o comando halt ou reboot, que sincroniza as alterações nos discos e executa a parada / desligamento real ou a reinicialização. [ 4 ]

De fato, hoje em dia, não confiamos mais na existência dos três Moirai [ 5 ] do mundo Linux , reboot, poweroffe halt[ 6 ] : a ciência moderna de ls -l $(which poweroff halt reboot)eo de man reboot, os spreads nova luz sobre esta idade das trevas e nos revelar que existe apenas um comando verdadeiro que analisa todas as suas opções, para que finalmente possamos pedir ações que contradigam os nomes de seus comandos! ( halt -pou reboot -ppara poweroff, shutdown -rpara reboot...)

Agora que tudo parecia claro e acolhedor para todos, os rumores afirmam que [ 7 ] no submundo do conjunto de ferramentas systemd [ 8 ] uma revolução foi realizada, deixando inconsciente o mundo inteiro . Graças a um exército de calços de compatibilidade com versões anteriores , nem percebemos que reinicialização, desligamento automático, interrupção [ 6 ] e até telinit [ 9 ] e desligamento [ 3 ] já estão vinculados ao novo rei systemctl [ 10 ]. Por favor, ouça toda a história da voz original de JdeBP The Bard [ 9 ], porque não tenho mais fôlego.

Se você é um seguidor do culto ao Ubuntu, ainda pode permanecer ciente por um tempo de todas essas reivindicações [ 11 ] .


A Terra meio halt -f, init, telinit, systemctl
Pesquisa pela solução mais rápida do que o correto, mas de igual modo sábio.

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

Se você está com o systemd ou não, deve poder parar o computador sem invocar todos os procedimentos de rejeição corretos (e muito mais rápido):

  1. halt -f: especificando a opção-f (observe que você precisa -fevitar o procedimento de desligamento) com o comando acima, com sudo poweroff -fou talvez até com sudo reboot -f -h. De fato, podemos ler man reboot(e equivalentes) sobre a necessidade de especificar a opção -fpara evitar o encerramento:

    Quando chamada com --force ou no nível de execução 0 ou 6, essa ferramenta chama a própria chamada de sistema reboot (2) (com o argumento REBOOTCOMMAND passado) e reinicia o sistema diretamente .

    Caso contrário, isso simplesmente chama a ferramenta shutdown (8) com os argumentos apropriados sem passar o argumento REBOOTCOMMAND.

    -f, --force
    Não chama shutdown (8) e, em vez disso, executa a ação real que você esperaria do nome .

  2. Além disso, você pode usar telinit [ 2b ] (ou initdiretamente)

    sudo telinit 0    # or 6
    

    dizer ao init para alterar o nível de execução ... mas se sim, por que não o mata diretamente?

  3. Em systemd, você pode usar a opção dupla imprudente --force --force

    systemctl --force --force poweroff  
    

    Leitura do manual do systemctl [ 10 ]

    -f, --force
    Quando usado com enable, substitui os links simbólicos conflitantes existentes.
    Quando utilizado com halt, poweroff,reboot ou kexec, executar a operação seleccionada sem desligar todas as unidades. No entanto, todos os processos serão eliminados à força e todos os sistemas de arquivos são desmontados ou remontados somente leitura. Portanto, é uma opção drástica, mas relativamente segura, para solicitar uma reinicialização imediata. Se --force for especificado duas vezes para essas operações, elas serão executadas imediatamente sem encerrar nenhum processo ou desmontar nenhum sistema de arquivos. Aviso: especificar --force duas vezes com qualquer uma dessas operações pode resultar em perda de dados.

Ps> Inspire-se nas variantes da cauda JdeBP The Bard [ 7 ] .


9

Você pode desligar a máquina imediatamente sem sincronizar discos, escrevendo "o" em / proc / sysrq-trigger como root.

Como um shell script, seria algo como

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

Se você tiver permissões em / proc / sysrq-trigger, não precisará habilitá-lo através do sysctl. Essa opção afeta apenas o disparo pelo teclado.

Não recomendo fazer isso em uma máquina com qualquer sistema de arquivos que você queira ler mais tarde.

Eu uso isso no Google Compute Engine para abater instâncias de modelo antes da marca de dez minutos para maximizar a relação custo-benefício dos trabalhos de cluster, funciona muito bem.


5
Esta é a melhor resposta para esta pergunta. O OP afirma claramente que deseja desligar o sistema de maneira semelhante, como se desconectado da fonte de energia, eles não se importam com danos ou com "fazê-lo corretamente". Eu não entendo por que ninguém pode entender isso.
Petr

11
bem vez de oreiniciar (relevante desde que a pergunta foi atualizada).
Kamil Maciorowski

7

Você precisa usar a combinação de teclas Magic SysRqREISUB .

Repita comigo: " Criar elefantes é tão chato ... "


2
Não. O REISUB irá reiniciá-lo. O REISUO será encerrado. Ou simplesmente O.
Benoit



2

Mantenha pressionada a tecla liga / desliga por cerca de 4 segundos, é bastante rápido.


11
Se fazê-lo, lançando o interruptor de alimentação é realmente mais rápido;)
Gnoupi

É o mesmo que qualquer outro método de desligamento, supondo que o sistema operacional faça gerenciamento de energia.
22910 harrymc

11
Se você realmente não puder esperar alguns segundos e estiver consumindo muita energia, use um sistema de arquivos de registro em diário como ext3 / ext4 para não perder tantos dados devido a gravações não escritas.
CarlF 16/02/10

Não procurando uma maneira não programática / sem software de executar o desligamento, caso contrário, a sugestão do @Gnoupi é muito mais rápida. ;)
choc

2

Em certas distribuições linux, shutdown oferece a opção -n. (Veja homem desligado ). Certas distribuições (como o ubuntu, que usa o upstart em vez do sysvinit) não suportam sua flag no entanto, e essa flag é (como pode ser aprendido na página de manual) não isenta de riscos. Embora eu esteja usando isso há anos (no meu laptop, não me importo que todos os daemons sejam encerrados corretamente, ele só quer tudo morto e meu cache de disco liberado) (é mais rápido que um desligamento regular e mais seguro do que puxar o botão plug (e amigos)). Você pode ver se isso resolve o seu problema.


2

Eu usei esse pequeno script para desligar o sistema. Na verdade, é usado para uma brincadeira em uma máquina de "prototipagem": "Ei cara, vamos ver o que esse incrível .sh faz!"

#!/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.

(Este script imita o mesmo que pressionar Alt+ SysRq+ u/ s/o conforme explicado anteriormente.) É claro que não causo um encerramento anormal do sistema (tabelas mysql, etc, podem falhar), portanto, use somente em máquinas fictícias. Nota: A sincronização pode levar algum tempo. Vi que, se o sistema possui muita memória livre (para cache) e você copia vários arquivos em um pen drive, a sincronização leva mais tempo, mas eu o recomendo mesmo para uma brincadeira.

Editar: É melhor usar em syncvez de escrever 's' para sysrq-trigger: writing 's' não bloqueará a execução do script; portanto, após solicitar que o cache seja gravado no disco, a máquina será desligada imediatamente. Ao contrário do synccomando, syncretornará após a conclusão do processo de gravação. Portanto, a execução do script será bloqueada até que a limpeza do cache seja concluída.


11
Você não deveria estar antes de você? Além disso, como um loop:SEQUENCE=(s u o); for i in "${SEQUENCE[@]}"; do sleep 3; printf "${i}" > /proc/sysrq-trigger; done
Que Quotion
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.