AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1545627
Accepted
Jason C
Jason C
Asked: 2025-04-13 05:42:24 +0800 CST2025-04-13 05:42:24 +0800 CST 2025-04-13 05:42:24 +0800 CST

Executar um programa apenas uma vez na próxima reinicialização

  • 772

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.

boot
  • 2 2 respostas
  • 1229 Views

2 respostas

  • Voted
  1. Best Answer
    muru
    2025-04-14T01:19:39+08:002025-04-14T01:19:39+08:00

    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.

    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:

    1. Há suporte integrado no systemd para uma variedade de condições , como:

      ConditionPathExists=

      Verifique a existência de um arquivo. Se o caminho absoluto especificado não existir, a condição falhará. Se o caminho absoluto passado ConditionPathExists=for prefixado com um ponto de exclamação (" !"), o teste será negado e a unidade só será iniciada se o caminho não existir.

      Adicionado na versão 244.

      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.

    2. 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.

    3. É mais fácil verificar o status do script de configuração.

    4. É 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).

    • 14
  2. Leppie
    2025-04-13T06:59:21+08:002025-04-13T06:59:21+08:00

    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":

    @reboot [/path/to/script]
    

    Como parte de um script de instalação, a seguinte construção pode ser usada para adicionar a entrada do crontab:

    (crontab -l 2>/dev/null; echo "@reboot /opt/script_to_run.sh") | crontab -
    

    Verifique se a entrada está correta com a opção -l (lista):

    leppie@aud2404:~$ crontab -l
    @reboot /opt/script_to_run.sh
    @reboot /opt/some_other_script.sh
    

    De forma semelhante, para remover a entrada do crontab, é possível usar o sed para remover a entrada desejada:

    leppie@aud2404:~$ crontab -l | sed '\|/opt/script_to_run.sh|d' | crontab -
    leppie@aud2404:~$ crontab -l
    @reboot /opt/some_other_script.sh
    

    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.

    • 5

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve