Ubuntu 22.04
Criei um pacote Debian que precisa fazer algum trabalho de pós-instalação depois que o usuário reinicia sua máquina.
Tenho um script que faz o trabalho pós-reinicialização. Qual é a maneira correta de fazê-lo executar uma vez após a próxima reinicialização?
Minha ideia atual é registrá-lo como um serviço systemd que é executado uma vez e que toca em algum arquivo fictício depois de ser executado, e então, se o arquivo fictício existir (por exemplo, após reinicializações subsequentes), simplesmente não fazer nada.
Mas estou me perguntando se já existe alguma outra maneira integrada de executar um programa somente uma vez após a próxima reinicialização.
Como usuário, eu preferiria que você fizesse algo assim em vez de usar um script que se auto-remove magicamente ou algo do tipo, que seria difícil de rastrear depois. Vejo algumas vantagens nessa abordagem:
Há suporte integrado no systemd para uma variedade de condições , como:
E outros como
ConditionPathExistsGlob
,ConditionDirectoryNotEmpty
,ConditionFileNotEmpty
, etc.Se você desejar alterar o script para ser executado em cada inicialização, basta remover a condição.
Supondo que esse serviço e a condição estejam documentados, o usuário pode facilmente executar novamente o script, se necessário, garantindo que a condição não seja atendida.
É mais fácil verificar o status do script de configuração.
É mais fácil para o usuário impedir que o script seja executado (mascarando o serviço antes da instalação), para que ele possa executar o script na reinicialização que escolher (desmascarando quando quiser).
O Crontab foi projetado especificamente para executar comandos, scripts ou aplicativos em horários definidos. O uso do Crontab não requer permissões elevadas, a menos que arquivos e/ou configurações do sistema sejam modificados.
O Cron também vem convenientemente com a opção integrada "@reboot":
Como parte de um script de instalação, a seguinte construção pode ser usada para adicionar a entrada do crontab:
Verifique se a entrada está correta com a opção -l (lista):
De forma semelhante, para remover a entrada do crontab, é possível usar o sed para remover a entrada desejada:
Em seguida, adicione uma seção no seu script para remover a entrada do crontab depois que ele tiver concluído tudo o que precisava fazer.
O Cron não é um programa "obscuro" que faz coisas mágicas em segundo plano. É simplesmente um agendador de tarefas em nível de usuário. Além disso, é uma prática recomendada ter um script registrando o que ele faz (e quando) em um arquivo de log. Portanto, a combinação do cron com um script bem escrito nunca deve deixar o usuário se perguntando o que aconteceu. No mundo dos servidores, o cron é bastante utilizado.