Precisa que um programa Linux seja executado automaticamente ao iniciar o sistema? O systemd oferece uma solução para isso em praticamente todas as distribuições Linux modernas, incluindo o Ubuntu. Este guia irá mostrar como criar um serviço personalizado que se integra ao sistema e se comunica com o journal.
Este tutorial detalha como configurar um serviço que inicia junto com o sistema. Para programas gráficos que devem iniciar ao fazer login, o gerenciador de sessão da sua área de trabalho é a ferramenta correta.
Executando Programas Durante a Inicialização
Alguns softwares instalam-se de modo a iniciar automaticamente com o sistema Linux. Você também pode conseguir o mesmo comportamento para seus scripts ou outros programas, com algumas configurações.
O systemd, o gerenciador de serviços e sistema, controla quais programas são iniciados durante a inicialização. Ele é o primeiro processo a ser executado, sempre com o PID 1. Todos os outros processos em seu computador são iniciados pelo systemd ou por um processo já iniciado por ele.
Programas executados em segundo plano são chamados de daemons ou serviços. O “d” no nome “systemd” significa daemon. Neste artigo, criaremos um serviço de exemplo que seja:
- Integrado com o systemd através de um arquivo de unidade de serviço.
- Iniciado durante a inicialização do sistema.
- Controlável via systemctl, a interface de controle do systemd.
- Capaz de escrever no journal.
Criando o Programa de Serviço
Precisamos de um programa para o systemd executar. Criaremos um script simples chamado “htg.sh”. Neste tutorial, usaremos o editor de texto Gedit, mas você pode usar o seu editor preferido.
touch htg.sh
gedit htg.sh
O editor gedit será aberto. Insira o seguinte texto:
#!/bin/bash echo "htg.service: ## Iniciando ##" | systemd-cat -p info while : do TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p info sleep 60 done
Salve e feche o editor.
O script, embora simples, possui alguns pontos importantes:
- As linhas de “echo” enviam a saída para o journal do systemd através do systemd-cat. Os logs têm prioridade, usando a opção -p para indicar que são apenas informações.
- O script contém um loop infinito “while”.
- A variável “TIMESTAMP” captura a data e hora atuais. Essa informação é formatada e enviada para o journal.
- O script espera por 60 segundos após cada registro no journal, repetindo o processo.
Agora, vamos copiar o script para o diretório /usr/local/bin.
sudo cp htg.sh /usr/local/bin
E torna-lo executável:
sudo chmod +x /usr/local/bin/htg.sh
Criando o Arquivo de Unidade de Serviço
Cada programa gerenciado pelo systemd possui um arquivo de definição chamado arquivo de unidade de serviço. Ele contém as informações que o systemd usa para iniciar o programa e gerenciar seu comportamento.
Antes de criar um arquivo de unidade, verificamos se já não existe um com o mesmo nome.
sudo systemctl list-unit-files --type-service
Você pode percorrer a lista de arquivos de unidade, em ordem alfabética, para verificar se o nome desejado está livre.
Nosso serviço será “htg.service”. Como não existe, podemos criar o arquivo de unidade.
sudo gedit /etc/systemd/system/htg.service
No editor gedit, insira o seguinte:
[Unit] Description=Exemplo de Serviço How-To Geek Wants=network.target After=syslog.target network-online.target [Service] Type=simple ExecStart=/usr/local/bin/htg.sh Restart=on-failure RestartSec=10 KillMode=process [Install] WantedBy=multi-user.target
Salve e feche o editor.
As entradas têm os seguintes significados:
- Description: Descrição do serviço.
- Wants: Indica que o serviço “deseja”, mas não exige, que a rede esteja ativa antes de ser iniciado.
- After: Lista de unidades que devem ser iniciadas após este serviço.
- Type: Definido como “simple”, o systemd considera o serviço iniciado quando o processo do “ExecStart” é bifurcado.
- ExecStart: Caminho para o processo a ser iniciado.
- Restart: Define quando e se o serviço deve ser reiniciado (neste caso, “on-failure”).
- RestartSec: Tempo em segundos que o systemd espera antes de tentar reiniciar o serviço.
- KillMode: Define como o systemd encerra o processo, neste caso “process”, que usa SIGTERM apenas no processo principal. Para programas mais complexos, usaríamos “mixed” para garantir que todos os processos gerados sejam também encerrados.
- WantedBy: Indica que o serviço deve ser iniciado quando o sistema está num estado onde vários usuários podem fazer login.
O arquivo de unidade não precisa ser executável, mas suas permissões devem restringir quem pode editá-lo. Isso impede que um usuário malicioso altere o arquivo para executar programas não autorizados.
O comando abaixo concede permissões de leitura e escrita ao proprietário, permissões de leitura ao grupo e nenhuma permissão a outros:
sudo chmod 640 /etc/systemd/system/htg.service
Podemos usar o systemctl para verificar a sintaxe do nosso arquivo de unidade:
systemctl status htg.service
A ausência de erros indica que o arquivo de unidade está correto.
Iniciando o Serviço
Após adicionar ou modificar um arquivo de unidade, é necessário informar ao systemd para recarregar as definições:
sudo systemctl daemon-reload
Para que um serviço seja iniciado na inicialização, ele deve ser habilitado:
sudo systemctl enable htg
Habilitar um serviço não o inicia imediatamente, apenas o define para iniciar durante a inicialização. Para iniciar o serviço agora, use a opção “start”.
sudo systemctl start htg
Verificando o Serviço
Após iniciar o serviço manualmente ou após reiniciar o computador, verificamos se ele está funcionando corretamente:
sudo systemctl status htg.service
O status do serviço será exibido.
- O ponto verde indica que o serviço está funcionando sem problemas.
- O nome do serviço é “htg.service”, e a descrição é a que definimos no arquivo de unidade.
- É indicado o caminho do arquivo de unidade carregado (“/etc/systemd/system/htg.service”).
- O serviço está ativo e a hora em que foi iniciado também é mostrada.
- O PID do serviço é 7762.
- Há duas tarefas associadas ao serviço.
- O serviço está usando um total de 928 Quibibytes de memória.
- O grupo de controle inclui o script “htg.sh” e o comando sleep, que foi iniciado pelo script.
As últimas 10 entradas do journal produzidas por este serviço são exibidas, separadas por um minuto, como esperado.
Parando e Desativando o Serviço
Para parar o serviço, use o seguinte comando:
sudo systemctl stop htg.service
Isso interrompe o serviço, mas não impede que ele seja reiniciado ao reiniciar o computador. Para impedir que o serviço inicie na inicialização, desative-o:
sudo systemctl disable htg.service
Se o serviço estiver em execução, este comando não o interromperá, ele apenas informa ao systemd para não iniciá-lo na próxima inicialização.
Para parar o serviço e impedir que seja iniciado na inicialização, use os dois comandos.
Dica Importante
Teste seu programa cuidadosamente antes de configurá-lo como um serviço.