Executando uma unidade de serviço systemd na próxima inicialização, mas não nas inicializações subseqüentes

4

Eu tenho um script que quero executar durante a próxima inicialização do sistema, mas não nas inicializações subseqüentes. Eu quero usar o systemd para iniciá-lo, então eu criei um arquivo de serviço em /usr/lib/systemd/system/myscript.service :

[Unit]
Description=My script.

[Service]
Type=oneshot
ExecStart=/opt/mypackage/bin/myscript

[Install]
WantedBy=multi-user.target

Eu posso dizer ao systemd para executar este serviço na inicialização usando systemctl enable myscript.service .

O que eu preciso fazer para impedir que ele seja executado em botas subseqüentes?

Eu posso adicionar systemctl disable myscript.service ao final do meu script, mas isso sempre desativa o serviço. Se possível, gostaria de poder habilitar o serviço, iniciá-lo e ainda executá-lo na próxima inicialização.

    
por M. Dudley 01.10.2015 / 17:03

2 respostas

5

Você pode usar a diretiva ConditionPathExists= (consulte systemd.unit(5) ) para iniciar condicionalmente uma unidade. Isso permite que você deixe a unidade permanentemente ativada e a (temporariamente) desativá-la, excluindo um arquivo simples.

Não há distinção entre "iniciado na inicialização" e "iniciado a partir de systemctl start " no systemd. Uma solução alternativa seria verificar o tempo de atividade no seu script para tomar a decisão de ativar / desativar a unidade na próxima inicialização (excluindo / criando o arquivo ConditionPathExists= ).

    
por 03.12.2015 / 01:40
5

Note: this answer extends Siosm's answer, and includes an alternative solution. If you agree with the first part, please upvote Siosm's answer instead.

Na veia com a resposta do Siosm, use ConditionPathExists= e ConditionPathNotExists na seção [Path] do arquivo de serviço da unidade (veja systemd.path (5)) para tornar a execução do seu serviço condicional.

Por exemplo, se a responsabilidade de myscript é criar um arquivo ou uma pasta uma vez, adicione condições de inicialização que reflitam isso: ConditionPathNotExists=/path/to/folder .

Por outro lado, você pode fazer com que os ConditionPathExists apontem para um arquivo como /var/tmp/myscript.on-next-reboot que o script deve remover após a execução bem-sucedida. Você provavelmente pode adicionar a remoção como a diretiva ExecStartPost= da unidade.

Em geral, no entanto, você deve tentar trabalhar em seu sistema para que as ações de pós-reinicialização não sejam necessárias. Definir as coisas para executar na próxima inicialização é muito "semelhante ao Windows" em atitude. Usuários e administradores de Linux tendem a favorecer botas determinísticas, modulares e previsíveis; ter valores de tempo de execução condicionais acionam diferentes caminhos de inicialização torna o sistema de inicialização muito mais difícil de avaliar e torna mais propenso a quebras.

    
por 07.03.2016 / 23:00

Tags