IMPORTANTE: Eu posso restaurar o comportamento antigo se eu fizer:
apt install sysvinit-core
Além disso: as versões antigas baseadas em Red Hat também podem ser desligadas com interrupção.
Estou tentando entender por que no Debian 9 você não deve mais usar halt para desligar seu computador. Esse comportamento é removido do systemd. Eu sou um pouco assustador, mas acho que deve haver uma boa razão lógica.
Outros Unixes ou Unix-like têm esse mesmo comportamento ou o Linux está se transformando em algo diferente?
Agora, se você quiser desligar a máquina após o desligamento do sistema, você deve usar poweroff em vez de halt...
Alguém sabe como esse comando é interpretado em outros Unix-Like?
Isso não é duplicado, porque o debian 7 pode desligar com o halt, por exemplo.
Debian
Ao usar SysVinit em sistemas Debian(esque),
/etc/defaults/halt
inclui uma variável que define se o sistema executará halt ou poweroff no final da transição para o nível de execução 0. A configuração padrão éHALT=poweroff
.Antes do SysVinit 2.74 você não deveria executar
halt
diretamente, e a partir dessa versão, ohalt
comando SysVinit apenas chamaráshutdown -h
a menos que o nível de execução atual seja 0 ou 6. Isso está documentado nahalt(8)
página man. No final da transição para o nível de execução 0, os scripts de nível de execução serão executados$HALT
, que é igual apoweroff
padrão.RHEL/CentOS
O RHEL/CentOS 5 foi a última versão a usar o SysVinit: a versão 6 usou
upstart
e a versão 7 usasystemd
. No RHEL 5.11, o último script a ser executado ao fazer a transição para o nível de execução 0 é/etc/init.d/halt
, e suas últimas linhas são:Como o mesmo script também é executado no final da transição para o nível de execução 6 (reinicialização), o comando real a ser executado é definido pela variável
$command
, e será/sbin/halt
ou/sbin/reboot
. De acordo com o valor da$INIT_HALT
variável, o script decidirá se adiciona ou não a-p
opção. Essa variável é definida por/sbin/shutdown
. A página de manual do RHEL 5.11shutdown(8)
diz:(Sim, a página de manual do RHEL 5.11 menciona o Debian 3.1! Acho que alguém no RedHat portando patches de várias fontes para o RHEL perdeu uma referência...)
Parece que a RedHat decidiu codificar o teste mencionado acima no
/etc/init.d/halt
script de tal forma que desligar a energia (usando/sbin/halt -p
no final do desligamento) é a ação de parada padrão: a única maneira de conseguir parar sem desligar é usar a opção maiúscula-H
doshutdown
comando para solicitá-lo explicitamente, por exemploshutdown -hH now
Mas, novamente, o desligamento padrão é acionado pelos scripts de nível de execução personalizados pela distribuição Linux, portanto, não é realmente um recurso do
halt
comando SysVinit.Nota histórica
Sistemas antigos que usam SysVinit (tanto Linux quanto não) costumavam ter vários comandos que não deveriam ser usados diretamente, mas apenas como parte dos scripts de desligamento/reinicialização apropriados. Antes do SysVinit 2.74, o
/sbin/halt
comando sem opções teria feito o mesmo quehalt -f
o SysVinit moderno faz, ou seja, um desligamento brutal e imediato do kernel sem interromper nenhum serviço ou desmontar sistemas de arquivos.Pela mesma razão, estar acostumado com o
killall
comando Linux pode ser perigoso em outros Unixes. Sua página de manual ainda tem este aviso sinistro:Isso ocorre porque o SystemV clássico
killall
era um desses comandos projetados para serem usados apenas como parte de um script de desligamento. Em distribuições Linux com SysVinit, a versão clássica do comando pode ser encontrada comokillall5
. Ele literalmente mata todos os processos, exceto threads e processos do kernel em sua própria sessão: seu uso pretendido é em um script de desligamento após desligar todos os serviços, pouco antes de desmontar os sistemas de arquivos locais, para matar quaisquer outros processos que possam atrasar ou impedir a desmontagem.(Como eu sei disso, você pergunta? Bem, uma vez cometi o erro de executar
killall <something>
como root em um sistema Solaris 2.6. Uma experiência de aprendizado muito eficaz.)Esta questão é baseada em múltiplas falsidades.
Não
halt
se costumava desligar o computador, e isso não mudou com o systemd.halt
akahaltsys
desliga e pára.poweroff
é um comando mais recente que desliga e desliga. ( https://unix.stackexchange.com/a/196471/5132 explica as sutilezas disso que vou passar por cima aqui, já que a pergunta é apenas sobre sistemas operacionais Linux. Esta resposta se concentra apenas no AT&T System 5 UNIX lado do universo.)Como expliquei em https://superuser.com/a/900205/38062 , os computadores não são necessariamente capazes de desligar sob controle de software. A ação do comando
haltsys
ehalt
tem sido convencionalmente desligar e parar a máquina, sendo a próxima ação o operador usando um botão de reinicialização físico ou interruptor de alimentação.halt
ganhou uma opção-p
/--poweroff
para torná-lo equivalente apoweroff
, mas isso é sintomático de um crescimento geral de opções sobrepostas e autocontraditórias para esses comandos. Veja a página de manual dohalt
comando Upstart no Debian 7 . Háhalt --poweroff
lá. A página de manual dohalt
comando van Smoorenburg no Debian 7 também temhalt -p
.Mas isso não é algo que mudou com o systemd. systemd fornece o mesmo. O comando systemd
halt
também tem--poweroff
. Além disso, tem--reboot
e (para uma boa medida)--halt
opções.Eu tive que fazer o mesmo com o comando
halt
/haltsys
no nosh toolset , para compatibilidade.Você pode erroneamente pensar que o velho
halt
desligou seu computador. Mas isso era inequivocamente errado para o Upstart, e apenas verdadeiro para o conjunto de ferramentas van Smoorenburg se você encontrasse um bug .O bug, que só este ano finalmente foi corrigido, era que o
halt
comando van Smoorenburg simplesmente ignorava a presença ou ausência da-p
opção e, em vez disso, decidia se deveria parar ou desligar de acordo com o valor de uma configuração em/etc/default/halt
. Se você tivesse essa configuração definida para desligar,halt
sempre desligaria, mesmo que nenhuma-p
opção fosse fornecida. Por outro lado, se você tiver essa configuração definida como parada,halt
ela sempre será interrompida, mesmo se uma-p
opção for fornecida.Mas isso era um bug , não o comportamento documentado nem pretendido, não o comportamento de todos os
halt
comandos que estavam disponíveis no Debian, e não o comportamento convencional dohalt
comando em geral.Leitura adicional
halt
comportamento alterado não intencional do comando . Erro Debian #743555.