systemd: interrompe o processo de inicialização na falha (na verdade, faz um encerramento)

1

Como é possível parar imediatamente o processo de inicialização, mostrar alguma mensagem (sair da tela inicial) e desligar a máquina se um serviço disparado falhar?

Meu serviço inicia apenas um script. Se algo deu errado, ou melhor dizendo, se ocorrer uma condição especial, eu gostaria de desligar a máquina. Até agora, tentei colocar dentro do script um systemctl poweroff . Mas, infelizmente, esta chamada retorna imediatamente e o processo de inicialização continua normalmente fazendo o desligamento mais ou menos paralelo. No meu caso, a tela de login aparece por alguns segundos até que o desligamento seja feito.

Aqui está o meu arquivo de unidade:

[Unit]
Description=My Fancy Script
Before=NetworkManager.target

[Service]
Type=oneshot
ExecStart=/path/to/script
StandardOutput=journal+console

[Install]
WantedBy=basic.target

Eu até tentei usar FailureAction= , mas isso também não funciona.

Alguma idéia de como fazer isso? Deve haver um jeito "típico". Por exemplo, se um ponto de montagem não puder ser carregado, o sistema será colocado no modo de manutenção (essa coisa de ctrl-D;)) e a inicialização será interrompida.

    
por Karl 06.07.2016 / 12:44

2 respostas

1

There must be a "typical" way. For example, if a mountpoint could not be loaded, the system is put into maintenance mode and the bootup is interrupted.

Sim, existe. E se você olhar para /usr/lib/systemd/system/local-fs.target , descobrirá que é

OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly
    
por 06.07.2016 / 20:40
0

Eu vejo algumas opções. Uma é a opção brutal, que pode ser apropriada para um sistema sem estado que não pode ser corrompido. Isso é adicionar a opção --force a poweroff

poweroff --force

Os documentos para ele dizem: "Forçar parada imediata, desligar, reinicializar. Não entre em contato com o sistema init.".

Outros serviços continuarão em paralelo, mas o desligamento deve acontecer mais rápido.

O comportamento que você está vendo é porque o systemd está tentando inicializar o sistema como rápido possível, fazendo o máximo possível, como em paralelo. Isso significa que se move para uma próxima tarefa assim que uma dependência for satisfeita, não necessariamente quando uma o serviço termina de funcionar.

Como a tela de login e outros serviços não dependem do serviço em execução, eles estão sendo iniciados em paralelo, mesmo quando a seqüência de encerramento foi iniciada para executar.

Você pode resolver seu problema, forçando o processo de inicialização a pausar e aguardar sua tarefa para terminar antes de prosseguir. Primeiro, decida quais serviços devem começar até que seu serviço personalizado seja concluído e adicione esses serviços ou destinos ao seu arquivo com novas entradas Before = .

    
por 06.07.2016 / 15:03