Como executar um programa Linux na inicialização com systemd

Precisa iniciar um programa Linux na inicialização? O software systemd fornece uma maneira de fazer isso em qualquer distribuição Linux com systemd – que é a maioria deles hoje em dia, incluindo o Ubuntu. Vamos orientá-lo no processo de criação de um serviço integrado – e ele até fala com o jornal.

Este tutorial demonstra como configurar um serviço do sistema que é iniciado quando você inicia seu sistema. Para iniciar um programa gráfico ao entrar, use o gerenciador de inicialização da sua área de trabalho.

Executando programas na inicialização

Às vezes, o software que você instala em seu computador se conecta ao processo de inicialização do Linux, de modo que o programa é iniciado automaticamente toda vez que o computador é iniciado. Você pode facilmente obter esse mesmo comportamento com seus próprios programas e scripts ou, na verdade, com qualquer outro programa que esteja em seu computador.

Os programas que são lançados na inicialização são controlados pelo systemd, o sistema e serviço Gerente. systemd é o primeiro processo a ser executado na inicialização. Sempre tem ID do processo (PID) 1. Todos os outros processos em execução em seu computador são iniciados pelo systemd ou por um processo que o systemd já iniciou.

Os programas executados em segundo plano são chamados demônios ou serviços. O “d” no final de systemd significa daemon. Neste artigo, criaremos um serviço de exemplo. Para marcar todas as caixas, nosso serviço deve ser:

Integrado com systemd através de um arquivo de unidade de serviço
Lançado na inicialização
Controlável usando systemctl, o interface de controle para systemd
Capaz de escrever para o diário

Criando o programa de serviço

Precisamos ter um programa que o systemd seja lançado. Vamos criar um script simples, chamado “htg.sh”. Este tutorial usa o editor de texto Gedit, mas você pode usar o editor de texto que preferir.

touch htg.sh
gedit htg.sh

O editor gedit será aberto. Copie e cole o seguinte texto no editor.

#!/bin/bash

echo "htg.service: ## Starting ##" | 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 suas alterações e feche o editor.

  Como alterar as configurações de DNS no Linux

O roteiro não faz muito, mas há alguns pontos que valem a pena notar.

As duas linhas de eco são canalizadas através do systemd-cat, um programa que leva o saída de um programa e envia para o jornal. As inscrições para a revista têm prioridade. Estamos usando a opção -p (prioridade) para indicar que nossas mensagens são apenas para informação (informações). Não são erros ou avisos importantes.
Existe um loop while sem fim.
A variável TIMESTAMP é definida para a data e hora atuais. Isso é formatado em uma mensagem e enviado para o diário.
O script então dorme por 60 segundos.
Após 60 segundos, o loop é repetido. Portanto, esse script grava uma mensagem com carimbo de data/hora no diário uma vez por minuto.

Copiaremos o script para o diretório /usr/local/bin.

sudo cp htg.sh /usr/local/bin

E precisamos torná-lo executável:

sudo chmod +x /usr/local/bin/htg.sh

Criando o arquivo de unidade de serviço

Cada programa iniciado pelo systemd possui um arquivo de definição, chamado de arquivo de unidade de serviço. Isso contém certos atributos que o systemd pode usar para localizar e iniciar o programa e para definir alguns de seus comportamentos.

Precisamos criar um arquivo de unidade para nosso novo serviço, mas é prudente garantir que nenhum dos arquivos de unidade existentes tenha o nome que queremos dar ao nosso novo serviço.

sudo systemctl list-unit-files --type-service

Você pode percorrer a lista de arquivos de unidade, que é classificada em ordem alfabética, e verificar se o nome que deseja usar não foi usado.

Nosso serviço será chamado de “htg.service”. Nenhum arquivo de unidade tem esse nome, então podemos prosseguir e criar nosso arquivo de unidade.

sudo gedit /etc/systemd/system/htg.service

O editor gedit será aberto. Copie e cole o seguinte texto no editor:

[Unit]
Description=How-To Geek Service Example

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 suas alterações e feche o editor.

As entradas têm esses significados. Estas são entradas típicas. Nosso serviço simples não precisa da maioria deles, mas incluí-los nos permite explicá-los.

  Como instalar e usar o Rapid Photo Downloader no Linux

Descrição: Esta é uma descrição de texto do seu serviço.
Deseja: Nosso serviço deseja – mas não exige – que a rede esteja ativa antes que nosso serviço seja iniciado.
Depois: Uma lista de nomes de unidades que devem ser iniciadas após este serviço ter sido iniciado com sucesso, caso ainda não estejam em execução.
Tipo: Simples. O systemd considerará este serviço iniciado assim que o processo especificado pelo ExecStart for bifurcado.
ExecStart: O caminho para o processo que deve ser iniciado.
Reiniciar: Quando e se o serviço deve ser reiniciado. Definimos como “em caso de falha”.
RestartSec: quanto tempo esperar antes de tentar reiniciar o serviço. Este valor está em segundos.
KillMode: Define como o systemd deve matar o processo se pedirmos ao systemctl para parar o serviço. Temos esse conjunto para “processar”. Isso faz com que o systemd use o sinal SIGTERM apenas no processo principal. Se nosso serviço fosse um programa não trivial em vez de um script simples, definiríamos isso como “misto” para garantir que todos os processos gerados também fossem encerrados.
WantedBy: Definimos isso como “multi-user.target”, o que significa que o serviço deve ser iniciado desde que o sistema esteja em um estado em que vários usuários possam fazer login, independentemente de uma interface gráfica de usuário estar disponível ou não.

O arquivo de unidade não precisa ser executável, mas as permissões no arquivo de unidade devem restringir quem pode editá-lo. Você não quer que um usuário mal-intencionado ou malicioso altere o arquivo de unidade para que ele execute um programa completamente diferente.

Este comando dará ao proprietário permissões de leitura e gravação e permissões de leitura para o grupo. Outros não terão permissões.

sudo chmod 640 /etc/systemd/system/htg.service

Podemos fazer com que o systemctl verifique a sintaxe do nosso arquivo de unidade para nós, mesmo que o serviço ainda não esteja em execução. Quaisquer erros serão relatados. (Na verdade, a parte “.service” é opcional para a maioria dos comandos.)

systemctl status htg.service

Nenhum erro é destacado, o que significa que nosso arquivo de unidade está sintaticamente correto.

  Como configurar uma chave SSH no Linux

Iniciando o serviço

Ao adicionar um novo arquivo de unidade ou editar um existente, você deve informar ao systemd para recarregar as definições do arquivo de unidade.

sudo systemctl daemon-reload

Se você deseja que um serviço seja iniciado na inicialização, você deve habilitá-lo:

sudo systemctl enable htg

A ativação de um serviço não o inicia, apenas o define para ser iniciado no momento da inicialização. Para iniciar o serviço agora, você deve usar systemctl com 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, podemos verificar se nosso serviço está funcionando corretamente.

sudo systemctl status htg.service

O status do serviço é exibido para nós.

O ponto verde significa que nosso serviço está funcionando sem problemas.
O nome do serviço é “htg.service”, e a descrição longa é aquela que fornecemos no arquivo da unidade.
É mostrado qual arquivo de unidade foi carregado “/etc/systemd/system/htg.service”.
O serviço está ativo e a hora em que o serviço foi lançado está listada para nós.
Seu PID é 7762.
Há duas tarefas associadas ao serviço.
Um total de 928 Quibibytes de memória estão sendo usados ​​pelo serviço.
O grupo de controle inclui o script “htg.sh” e o comando sleep, que foi iniciado por “htg.sh”. Na maioria das vezes, o comando sleep fará o trabalho para este serviço.

Também são mostradas as últimas 10 entradas de diário produzidas por este serviço. Sem surpresa, todos eles estão separados por um minuto.

Parando e desativando o serviço

Se você precisar interromper o serviço, poderá fazê-lo com este comando:

sudo systemctl stop htg.service

Isso interrompe o serviço, mas não impede que ele seja reiniciado na próxima vez que o computador for reinicializado. Para interromper o lançamento do serviço na inicialização, você precisa desativá-lo:

sudo systemctl disable htg.service

Se o serviço estiver em execução, esse comando não o interromperá. Ele simplesmente diz ao systemd para não iniciar o serviço na próxima reinicialização.

Se você deseja interromper o serviço e impedir que ele seja iniciado na inicialização, use os dois comandos.

Dica de serviço

Certifique-se de que seu programa seja executado conforme o esperado antes de tentar iniciá-lo como um serviço.