Qual é a diferença entre esses comandos para derrubar um servidor Linux?
Leitura "Qual é a diferença entre os comandos Halt e Shutdown?" , Geralmente tenho uma ideia do que o comando shutdown faz, com ou sem as opções -h / -r.
O comando "halt" desliga o sistema para executar o nível 0 do sistema.
O comando "shutdown" executa o desligamento do sistema para executar o nível 1 sem o comando -h ou -r.
E o comando "poweroff" entra no nível de execução 0 ou 1? Essa é a única diferença principal entre esses três comandos?
— Win.T
Relacionadas askubuntu.com/q/578144/216503
— heemayl
Estas são algumas das coisas que diferem significativamente, por exemplo, Solaris e FreeBSD. (Lá eles normalmente (quase) imediatamente parar / desligar o servidor, sem alterar os níveis de execução para encerrar o material em primeiro lugar)
E agora, o sistema responde.
Você está usando, de acordo com a tag da sua pergunta, o Red Hat Enterprise Linux. Desde a versão 7, isso usou o systemd. Nenhuma das outras respostas está correta para o mundo do systemd; nem são algumas das suposições da sua pergunta.
Esqueça os níveis de execução ; eles existem, mas apenas como calços de compatibilidade. A documentação do systemd afirma que o conceito é "obsoleto". Se você está começando a aprender essas coisas em um sistema operacional systemd, não comece por aí.
Esqueça a página de manual que marcelm citou; não é do conjunto de ferramentas certo e é uma descrição do comando de outro conjunto de ferramentas, incorreto para o systemd. É o haltcomando dos initutilitários "System 5" da van Smoorenburg .
Ignore as declarações às quais /sbin/halté um link simbólico /sbin/reboot; isso não é verdade com o systemd. Não há nenhum rebootprograma separado .
Ignore as instruções que haltou rebootinvocam um shutdownprograma com argumentos de linha de comando; eles também não são verdadeiros com o systemd. Não há nenhum shutdownprograma separado .
Todo conjunto de ferramentas de gerenciamento do sistema tem sua versão desses utilitários. systemd, arrivista, nosh , van Smoorenburg inite BSD inittodos têm a sua própria halt, poweroffe assim por diante. Em cada uma delas, sua mecânica é um pouco diferente. O mesmo acontece com as páginas de manual.
No conjunto de ferramentas systemd halt, poweroff,reboot , telinit, e shutdownsão todos os links simbólicos para /bin/systemctl. Eles são todos os calços compatibilidade com versões anteriores, que são simplesmente atalhos para invocar interface de linha de comando primário de systemd: systemctl. Todos eles mapeiam (e de fato são) o mesmo programa único . (Por convenção, o shell diz a que nome foi chamado.)
destinos, não níveis de execução
A maioria desses comandos são atalhos para dizer ao systemd, usando systemctl, para isolar um destino específico . O isolamento é explicado na systemctlpágina de manual (qv), mas, para os fins desta resposta, pode ser considerado como iniciar um alvo e parar qualquer outro. Os destinos padrão usados ​​no systemd estão listados na systemd.specialpágina de manual (8).
Os diagramas na bootuppágina de manual (7) no conjunto de ferramentas systemd, em particular o último, mostram que existem três destinos "finais" relevantes aqui:
halt.target- Depois que o sistema atingir o estado de isolar completamente esse destino, ele terá chamado a reboot(RB_HALT_SYSTEM)chamada de sistema. O kernel terá tentado entrar em um programa de monitoramento de ROM ou simplesmente interrompido a CPU (usando qualquer mecanismo apropriado para isso).
reboot.target- Depois que o sistema atingir o estado de isolar completamente esse destino, ele terá chamado a reboot(RB_AUTOBOOT)chamada de sistema (ou o equivalente à linha de comando mágica). O kernel terá tentado acionar uma reinicialização.
poweroff.target- Depois que o sistema atingir o estado de isolar completamente esse destino, ele terá chamado a reboot(RB_POWER_OFF)chamada de sistema. O kernel terá tentado remover a energia do sistema, se possível.
Essas são as coisas em que você deve pensar como o sistema final declara, não executar níveis. Observe no diagrama que o próprio sistema systemd de destino codifica coisas que são, em outros sistemas, implícitas e não explícitas: como a noção de que cada um desses destinos finais abrange o shutdown.targetdestino, de modo que se descreve serviços que devem ser interrompidos antes do desligamento por tê-los em conflito com o shutdown.targetalvo.
systemctltenta enviar solicitações para systemd-logindquando o usuário que chama não é o superusuário. Ele também passa os desligamentos atrasados ​​para systemd-shutdownd. E algumas atalhos acionam wallnotificações. Essas complexidades à parte, que tornariam essa resposta várias vezes mais longa, supondo que você seja o superusuário no momento e não solicite uma ação agendada:
systemctl isolate halt.target tem as taquigrafia:
simples sem adornos halt
systemctl isolate reboot.target tem as taquigrafia:
simples sem adornos reboot
systemctl isolate poweroff.target tem as taquigrafia:
simples sem adornos poweroff
systemctl isolate rescue.target tem as taquigrafia:
systemctl isolate multi-user.target tem as taquigrafia:
systemctl isolate graphical.target tem a abreviação:
Após analisar as várias sintaxes diferentes da linha de comando, todas elas acabam nos mesmos caminhos de código dentro do systemctlprograma.
O comportamento tradicional do sem opção shutdown nowtem sido mudar para o modo de usuário único . Este não é o caso do systemd. rescue.target- o modo de usuário único sendo renomeado para modo de recuperação no systemd - não pode ser acessado com o shutdowncomando
telinit realmente não totalmente ignorar todos aqueles e links simbólicos no sistema de arquivos que as páginas do manual descrever. Os mapeamentos citados anteriormente são conectados ao programa em uma tabela.runlevelN.targetdefault.targetsystemctl
systemd não tem noção de um nível de execução atual . A operação desses comandos não depende de nenhum "se você estiver no nível de execução N ".
A --forceopção para o halt, reboote poweroffcomandos é o mesmo que dizer --force --forceaos systemctl halt, systemctl reboote systemctl poweroffcomandos. Isso faz com que systemctltente ligar reboot()diretamente. Normalmente, apenas tenta isolar alvos.
telinitnão é o mesmo que init. São programas diferentes no mundo sistêmico, sendo este último outro nome para o systemdprograma, não para o systemctlprograma. O systemdprograma não é necessariamente compilado com nenhuma compatibilidade de van Smoorenburg e, em alguns sistemas operacionais do sistema, reclama de ter sido chamado incorretamente se alguém tentar .init N
Existem boas razões para interromper o sistema sem cortar a energia?
Por que o `init 0` resulta em" Excesso de Argumentos "na instalação do Arch?
Stephen Wadeley (2014). "8. Gerenciando Serviços com o systemd" Guia do Administrador do Sistema Red Hat Enterprise Linux 7 . Chapéu vermelho.
Lennart Poettering (07-10-2013). systemctl. páginas de manual do systemd. freedesktop.org.
Lennart Poettering (07-10-2013). systemd.special. páginas de manual do systemd. freedesktop.org.
Lennart Poettering (07-10-2013). bootup. páginas de manual do systemd. freedesktop.org.
Jonathan de Boyne Pollard (2018). init. Guia nosh . Softwares.
Isso é muito genérico para a maioria dos sistemas Linux modernos. Por exemplo, respostas wiert.me/2012/12/30/… Depois de todos esses anos pensando, finalmente entendo o que está acontecendo e por quê.
systemctl rebootdeve ser equivalente a systemctl start reboot.target --job-mode=replace-irreversible. Usar qualquer outro modo de trabalho é menos robusto. unix.stackexchange.com/questions/381739/…
Eu li toda a sua resposta e absorvi o que pude. Uma pergunta permanece, a mesma que eu vim aqui, é systemctl reboota maneira "segura" de reinicializar, por exemplo, init 6qual é a maneira que, de outra forma, seria reiniciar com segurança?
haltinstrui o hardware a parar todas as funções da CPU , mas o deixa em um estado ligado. Isso geralmente significa que alguém precisa reiniciar ou desligar a máquina manualmente pressionando o botão liga / desliga. A maneira específica de conseguir isso é específica da arquitetura, mas, por exemplo, o conjunto de instruções x86 fornece as HLTinstruções que interrompem a unidade central de processamento (CPU) até que a próxima interrupção externa seja acionada.
poweroff, como halt, interrompe a CPU, mas também envia um sinal de hardware ACPI que instruirá o sistema a iniciar com um desligamento completo e imediato. Isso é aproximadamente equivalente a pressionar o botão liga / desliga em um computador desktop típico.
Ambos halte poweroffsão geralmente links simbólicos para o rebootexecutável, que normalmente irá invocar a shutdownferramenta com os argumentos apropriados ( -h, -Pou r), dependendo se halt, poweroffou rebootfoi usado para invocar a ferramenta. No entanto, quando a --forceopção for passada para rebootou no nível de execução 0 ou 6, reboota reboot()chamada do sistema será chamada com o próprio código de comando apropriado.
— Thomas Nyman
Thomas, muito obrigado por explicar. Estou interessado em saber o que é fazer um #init 0, não há muitas diferenças, certo?
@ Win.T Mudar para o nível de execução 0 usando, por exemplo, /sbin/init 0ou /sbin/telinit 0deve ser o mesmo que interromper o sistema, embora as etapas específicas tomadas dependam do sistema init em questão, como System-V init , upstart ou systemd . Se você estiver executando o RHEL, estará usando o systemd.
Nota para si mesmo: sempre que alguém reclamar de uma chamada arcana da API do Win32, mostre a ele a reinicialização (2).
@immibis Mas a reinicialização é propositalmente misteriosa. Requer as bandeiras mágicas para que seja muito difícil fazer por acidente.
@ KevinCox Esse é o argumento para exigir bandeiras mágicas. Não é o argumento para aceitar 4 valores diferentes para magic2, nem para se comportar de maneira diferente dentro de um espaço de nome PID, nem para agrupar várias operações pouco relacionadas (como definir o comportamento de reinicialização no Ctrl-Alt-Delete) em uma função.
halt, poweroffE shutdown -hsão completamente equivalentes. De fato, parada e desligamento não fazem nada além de chamar shutdown -h. Na página de manual de interrupção / desligamento:
Se parar ou reiniciar for chamado quando o sistema não estiver no nível de execução 0 ou 6, ou seja, quando estiver executando normalmente, o encerramento será invocado (com o sinalizador -h ou -r). Para mais informações, consulte a página de manual shutdown (8).
O desligamento prossegue para desligar o sistema alternando para o nível de execução 0.
Parada e desligamento (e reinicialização) desempenham uma função dupla; quando executados no processo de desligamento (ou seja, no nível de execução 0 ou 6), eles executam as operações de baixo nível necessárias para parar, desligar ou reiniciar fisicamente a máquina, conforme descrito em outra resposta.
Qual versão do RHEL você está usando? Normalmente, há uma diferença entre parada e desligamento (embora, por algum tempo, isso não acontecesse em muitas distribuições, mas isso era um bug).