Como usar o systemd para iniciar programas na inicialização do Raspberry Pi
Raspberry Pi é um poderoso SBC (computador de placa única) que você pode usar para vários aplicativos e projetos. Sua versatilidade reside em sua capacidade de executar todos os tipos de programas, incluindo scripts personalizados, graças em parte ao Raspberry Pi OS e outros sistemas operacionais baseados em Linux que executa.
Executar um script ou programa no Raspberry Pi é tão simples quanto encontrá-lo no sistema e executá-lo. Mas e se você quiser automatizar esse processo, talvez porque seu projeto assim o exija ou porque deseja agilizar seu fluxo de trabalho?
Uma resposta para isso é aprender a usar o systemd.
O que é Systemd?
systemd é um conjunto de componentes de sistema para configuração e comportamento de serviço em sistemas Linux modernos. É identificado com um PID (identificador de processo) de 1, pois é o primeiro processo a inicializar na inicialização do sistema. Em geral, o objetivo do systemd é ajudá-lo a gerenciar e executar programas na inicialização do sistema. E é isso que você aproveitará para lançar seu programa na inicialização do Pi.
Conforme mencionado inicialmente, existem vários métodos para executar programas na inicialização em sistemas Linux, como rc.local, cron e autostart. No entanto, o systemd é uma solução melhor do lote se você deseja iniciar programas GUI (interface gráfica do usuário), automatizar aplicativos para serem executados após o início de certos processos do sistema ou executar programas repetidamente até que seu agendamento funcione.
Como usar o systemd para iniciar programas na inicialização
systemd é um método um pouco mais complicado de lançar programas na inicialização em sistemas Linux. No entanto, a flexibilidade de agendamento que ele oferece sobre outros métodos – os que mencionamos acima – supera totalmente sua complexidade em todos os aspectos.
O método systemd usa arquivos de unidade, que são como arquivos .ini que contêm informações de codificação sobre dispositivos, serviços, soquetes, destino de inicialização e outros componentes essenciais do sistema.
Os arquivos de unidade são de vários tipos. Portanto, com base no tipo de recurso que deseja declarar, você precisa escolher um tipo de arquivo de unidade de acordo. Para o propósito deste guia, no entanto, nos limitaremos aos arquivos de unidade .service, que permitem gerenciar o comportamento de inicialização de programas e scripts no sistema.
Abaixo está uma análise das etapas envolvidas no lançamento de um script / programa na inicialização usando o systemd.
Criação de um serviço
Para definir seu programa para ser executado na inicialização, crie um arquivo de unidade de serviço que dirá ao systemd qual programa executar e quando. Veja como fazer.
- Na janela CLI, digite sudo nano /lib/systemd/system/display.service . Você pode usar qualquer nome para o seu serviço, desde que termine com a extensão .service.
- No arquivo de serviço, cole as seguintes linhas de código:
[Unit]
Description=PiCounter
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
Todas as suas opções de configuração comuns estão nas seções Unidade e Instalar , enquanto as opções de configuração específicas do serviço vão na seção Serviço.
Alguns dos pares de valor de diretiva acima que você pode precisar modificar incluem:
eu. Depois: determina quando iniciar o serviço. Configurá-lo como network.target garante que o valor listado – network.target neste caso – comece antes de iniciar a unidade atual. No entanto, ele não direciona um relacionamento de dependência para o serviço acionar; isso é feito por meio de outras diretivas, como Deseja, Requer e Desejado.
Claro, você pode alterar esse valor para atender aos requisitos do seu projeto. Por exemplo, se você deseja que seu programa seja executado após o Raspberry Pi se conectar a uma rede, você pode usar o valor network-online.target . Você pode consultar a documentação do Fedora no systemd para aprender mais sobre esses valores.
ii. ExecStart: contém o caminho absoluto e o nome do programa / script que você deseja executar na inicialização. Portanto, dependendo do que você deseja executar, é necessário adicionar valores para ambas as diretivas.
iii. Usuário: identifica o nome do seu Raspberry Pi. Se você mudou o nome do seu Pi, você precisa colocar esse valor para o usuário.
4. WantedBy: É a forma mais comum de especificar o gatilho para uma unidade. Definindo-o como multi-user.target , você pode estabelecer um relacionamento de dependência que executará o programa quando o controle do sistema for entregue ao shell multiusuário.
Além disso, ele também executa seu programa antes que o sistema X-Windows de Pi seja iniciado, o que significa que seu programa é executado antes mesmo de você efetuar login no sistema. Caso queira que um script seja executado antes de fazer login no Raspberry Pi, isso permite que você faça isso.
As linhas de código acima funcionam para programas não-GUI. No entanto, se você deseja executar um programa GUI usando o systemd, deve adicionar o seguinte código ao seu arquivo de serviço:
[Unit]
Description=PiCounter
After=network.target
[Service]
Environment=Display=:0
Environment=XAUTHORITY/home/pi/.Xauthority
ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
Restart=always
[Install]
WantedBy=multi-user.target
No par de valor de diretiva acima, tudo o que você precisa alterar é o valor da diretiva ExecStart . Substitua o do bloco de código pelo programa que deseja executar na inicialização. Depois de preencher o arquivo de serviço, pressione CTRL + O para salvá-lo.
Teste o serviço
Com o serviço pronto, verifique manualmente se funciona. Para isso, digite o seguinte comando no terminal: sudo systemctl start display.service . O serviço deve executar suas instruções com sucesso.
Depois de fazer isso, encerre-o com sudo systemctl stop display.service .
Habilite o serviço
Se você conseguiu executar seu programa com sucesso usando o serviço, é hora de habilitá-lo para que execute seu programa automaticamente toda vez que você inicializar seu Raspberry Pi.
Para fazer isso, digite sudo systemctl enable display.service na janela do terminal. E uma vez feito isso, digite sudo reboot para reiniciar seu Pi.
Assim que o Raspberry Pi for inicializado, o systemd deve executar o programa de acordo com as instruções fornecidas.
Automatizando o lançamento do programa na inicialização do Raspberry Pi
Como a maioria dos sistemas Linux, o Raspberry Pi OS também permite realizar operações de várias maneiras e também permanece fiel ao agendamento de inicializações de programas. Portanto, se você deseja iniciar programas / scripts de GUI na inicialização e deseja melhor controle sobre sua programação, o systemd é claramente um método melhor.
Dito isso, no entanto, se você quiser uma solução mais simples ou se os requisitos do seu projeto exigirem um agendamento específico, você pode verificar nosso guia para Executar um programa Raspberry Pi ou script na inicialização para saber mais.