Como executar um comando ou script como root na inicialização usando systemd ou um serviço do cron

16 de dezembro de 2021

how-torun-a-command-as-root-on-startup

Este artigo explica como executar um comando ou script na inicialização como root no Linux, de duas maneiras: usando systemd ou um serviço de cron.

Como usar o systemd para executar um comando ou script como root na inicialização

Para usar o systemd para executar um comando ou script como root quando o computador inicializa, crie um arquivo (como root) chamado meucomando.service (substitua meucomando com o que você quiser chamá-lo) em /etc/systemd/system/.

Podemos usar o editor de texto da linha de comando Nano para abrir/criar este arquivo:

Comandos para usar no terminal

sudo nano /etc/systemd/system/meucomando.service

Neste arquivo, cole o seguinte:

[Unit]

Description=your description
[Service]

ExecStart=/path/to/command/or/script
[Install]
WantedBy=multi-user.target

Aqui, altere o valor Description para descrever o que ele faz, e o valor ExecStart para o comando ou caminho do script que você deseja executar como raiz na inicialização. Não adicione sudo no início do comando ou script, porque ele funciona como root qualquer maneira.

Agora salve o arquivo e saia do Nano. Caso você não esteja familiarizado com o editor de textos Nano, você pode salvar o arquivo pressionando Ctrl + o e, em seguida, Enter. Saia pressionando Ctrl + x.

Em seguida, você precisa habilitar o serviço do systemd para ser executado na inicialização, usando o seguinte comando:

Comandos para usar no terminal

sudo systemctl enable meucomando.service

Lembre-se de substituir meucomando.service pelo nome de arquivo real que você usou para este arquivo de serviço do systemd. Não há necessidade de executar o serviço do systemd agora, já que ele deve executar no boot.

Se você usar isso para executar um script, certifique-se de tornar o script executável (chmod +x /caminho/para/script) ou então ele não será executado.

Este é um arquivo de unidade systemd muito simples que é executado apenas uma vez. Estes podem ser muito mais complexos, dependendo do que você precisa. Por exemplo, você pode usar um comando que funciona antes ExecStart, tê-lo iniciado somente depois que outra unidade se tornar ativa, ter o comando executado somente após outro serviço, por exemplo, o serviço de rede foi iniciado (After=network.target, ao mesmo tempo em que declara uma dependência deste serviço usando Wants= ou Requires=), e muito mais. Verifique as páginas man systemd.service e systemd.unit para obter mais detalhes.

Como usar um serviço de cron para executar um comando ou script como root na inicializaçã

Para usar um serviço de cron para executar um comando ou script como root quando o sistema inicializa, edite o crontab do usuário root usando:

Comandos para usar no terminal

sudo crontab -e

E na parte inferior do arquivo (ele também pode estar vazio), use o seguinte:

Comandos para usar no terminal

@reboot /caminho/para/comando/ou/script

Agora salve o crontab e saia. Se você usou o editor da linha de comando Nano para editá-lo (deve ser padrão na maioria dos casos), você pode salvar o arquivo pressionando Ctrl + o e, em seguida, Enter. Saia do nano pressionando Ctrl + x. Não adicione sudo antes do comando ou script, porque ele roda como root de qualquer maneira, já que é adicionado ao crontab do root.

Caso você queira usar um editor específico para editar o crontab do root, execute-o assim: sudo EDITOR=editor crontab -e, por exemplo, para Vim: sudo EDITOR=vim crontab -e, ou para Nano: sudo EDITOR=nano crontab -e.

Algumas notas sobre isso:

  • Se você usar isso para executar um script, certifique-se de tornar o script executável (chmod +x /caminho/para/script) ou então ele não será executado
  • Use o caminho completo para o comando ou script, ou então ele pode falhar em executar (isso depende da distribuição Linux que você está usando, por exemplo, você não precisa usar o caminho completo no Ubuntu 20.04, por exemplo)
  • Se o script que roda pelo cron também incluir comandos sem o caminho completo, você pode evitar ter que reescrever o script adicionando isso no topo do arquivo crontab: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  • Se você precisar atrasar o início do comando/script, você pode fazer uso do comando sleep, por exemplo: @reboot /usr/bin/sleep 60; /caminho/para/comando/ou/script executar o comando ou script 60 segundos após as inicializarem o sistema

Qual escolher entre systemd ou um serviço de cron para executar um comando ou script como root na inicialização, se você tiver uma escolha? Na dúvida, escolha systemd (se estiver disponível no seu sistema) porque deve ser mais confiável e mais fácil de usar.

Por exemplo, nem todas as versões do cron suportam a opção @reboot, ou o comando/script só pode ser executado quando o sistema é reiniciado, e não quando ele é desligado (isso não aconteceu para mim no Ubuntu 20.04, Fedora 24, Manjaro Linux e Debian 10, mas isso pode acontecer em algumas distribuições Linux).

Também vale a pena notar que @reboot configura um serviço para executar uma vez quando o daemon é iniciado. cron não é geralmente reiniciado, então isso geralmente corresponde à máquina sendo inicializada. Por exemplo, o Debian (e as distribuições Linux baseadas no Debian) impõe isso, fazendo com que o cron não re-execute serviços com @reboot quando o serviço cron é reiniciado. Em algumas distribuições Linux, porém, reiniciar o serviço do cron pode re-executar os comandos @reboot.

Além disso, no Fedora, o cron não é instalado por padrão (instale-o usando sudo dnf install cronie). No Manjaro, o cron é instalado por padrão, mas não habilitado por padrão (habilite-o usando sudo systemctl enable --now cronie).

Gosta de automatizar e usar ferramentas de terminal no Linux para facilitar seu trabalho? Veja outros artigos relacionados, como este em que explicamos como encontrar todos os arquivos contendo um texto específico no Linux pela linha de comando; este em que mostramos como lançar aplicativos de inicialização com um atraso; e este que apresentamos de maneira simples como executar um comando depois que o anterior terminou no Linux.

Esse post foi traduzido do site LinuxUprising.com pela rtland.team.

Linux Uprising Blog
Propaganda
Propaganda