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

Uma janela de terminal estilizada em um laptop.
Fatmawati Achmad Zaenuri / Shutterstock

Precisa lançar um programa Linux na inicialização? O software systemd fornece uma maneira de fazer isso em qualquer distribuição Linux com systemd – o que é a maioria deles atualmente, incluindo o Ubuntu. Orientaremos você 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 o sistema. Para iniciar um programa gráfico ao entrar, use o gerenciador de inicialização de sua área de trabalho .

Execução de programas na inicialização

Às vezes, o software que você instala no computador se conecta ao processo de inicialização do Linux, de modo que o programa é iniciado automaticamente sempre que o computador é iniciado. Você pode obter facilmente 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 controladas por systemd, o sistema e serviço gerente. systemdé o primeiro processo a ser executado na inicialização. Ele sempre tem ID de processo (PID) 1. Todos os outros processos em execução em seu computador são iniciados por systemd, ou por um processo que systemdjá foi iniciado.

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

  • Integrado por systemdmeio de um arquivo de unidade de serviço
  • Lançado na inicialização
  • Controlável usando  systemctl, a interface de controle parasystemd
  • Capaz de escrever para o jornal

Criando o Programa de Serviço

Precisamos ter um programa que systemdserá lançado. Vamos criar um script simples, chamado “htg.sh”. Este tutorial usa o editor de texto Gedit, mas você pode usar qualquer editor de texto de sua preferência.

toque em htg.sh
gedit htg.sh

toque em htg.sh em uma janela de terminal

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

#! / bin / bash

echo "htg.service: ## Starting ##" | systemd-cat -p info

enquanto :
Faz
TIMESTAMP = $ (data '+% Y-% m-% d% H:% M:% S')
echo "htg.service: timestamp $ {TIMESTAMP}" | systemd-cat -p info
dormir 60
feito

Salve suas alterações e feche o editor.

Recomendado:  Como fazer seu Amazon Echo ler seus livros Kindle em voz alta

script htg.sh no editor gedit

O script não faz muita coisa, mas existem alguns pontos dignos de nota.

  • As duas  echolinhas são canalizadas systemd-cat, um programa que pega a saída de um programa e a envia para o diário . As entradas no diário têm prioridade. Estamos usando a  -popção (prioridade) para indicar que nossas mensagens são apenas informativas (informações). Não são erros ou avisos importantes.
  • Existe um whileciclo infinito .
  • A TIMESTAMPvariável é definida para a data e hora atuais. Isso é formatado em uma mensagem e enviado ao diário.
  • O script então dorme por 60 segundos.
  • Após 60 segundos, o loop é repetido. Portanto, este script grava uma mensagem com carimbo de data / hora no diário uma vez por minuto.

Vamos copiar o script para o /usr/local/bindiretório.

sudo cp htg.sh / usr / local / bin

sudo cp htg.sh / usr / local / bin em uma janela de terminal

E precisamos torná-lo executável:

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

sudo chmod + x /usr/local/bin/htg.sh em uma janela de terminal

Criação do arquivo de unidade de serviço

Cada programa que é iniciado por systemdpossui um arquivo de definição, denominado arquivo de unidade de serviço. Isso contém certos atributos que systemdpodem ser usados ​​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 desejamos dar ao novo serviço.

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

sudo systemctl list-unit-files --type-service em uma janela de terminal

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

Lista de arquivos de unidade do systemd em uma janela de terminal

Nosso serviço se chamará “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

sudo gedit /etc/systemd/system/htg.service em uma janela de terminal

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

[Unidade]
Descrição = How-To Geek Service Example

Want = network.target
After = syslog.target network-online.target

[Serviço]
Tipo = simples
ExecStart = / usr / local / bin / htg.sh
Reiniciar = em caso de falha
RestartSec = 10
KillMode = processo

[Instalar]
WantedBy = multi-user.target

Salve suas alterações e feche o editor.

Recomendado:  Como Criar uma Faixa Dinâmica Definida no Excel

arquivo de unidade htg.service no editor gedit

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

  • Descrição: esta é uma descrição de texto do seu serviço.
  • Desejo: nosso serviço deseja – mas não exige – que a rede esteja ativa antes de nosso serviço ser iniciado.
  • Depois: Uma lista de nomes de unidades que devem ser iniciados após este serviço ter sido iniciado com sucesso, se ainda não estiverem em execução.
  • Tipo: Simples. systemdirá considerar este serviço iniciado assim que o processo especificado por ExecStartfor 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 systemddevemos encerrar o processo se pedirmos systemctlpara interromper o serviço. Temos isso definido como “processo”. Isso faz systemdcom que o SIGTERMsinal seja usado 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: temos definido como “multi-user.target”, o que significa que o serviço deve ser iniciado enquanto o sistema estiver em um estado em que vários usuários possam efetuar login, estando ou não disponível uma interface gráfica de usuário.

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 malicioso 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ão.

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

sudo chmod 640 /etc/systemd/system/htg.service em uma janela de terminal

Podemos ter systemctlverificado a sintaxe de nosso arquivo de unidade para nós, mesmo se o serviço ainda não estiver em execução. Quaisquer erros serão relatados. (Na verdade, a parte “.service” é opcional para a maioria dos comandos.)

systemctl status htg.service

systemctl status htg.service em uma janela de terminal

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

Recomendado:  O que significa “TTS” e como você o usa?

Iniciando o serviço

Quando você adiciona um novo arquivo de unidade ou edita um existente, você deve informar systemdpara 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

Habilitar um serviço não o inicia, apenas o configura para ser iniciado no momento da inicialização. Para iniciar o serviço agora , você deve usar systemctlcom a startopção.

sudo systemctl start htg

sudo systemctl daemon-reload em uma janela de terminal

Verificando o serviço

Depois de iniciar manualmente o serviço ou reiniciar o computador, podemos verificar se nosso serviço está funcionando corretamente.

sudo systemctl status htg.service

sudo systemctl status htg.service em uma janela de terminal

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

Status de htg.service em um terminal widnow

  • O ponto verde significa que nosso serviço está funcionando perfeitamente.
  • 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 é listada para nós.
  • Seu PID é 7762.
  • Existem duas tarefas associadas ao serviço.
  • Um total de 928 Kibibytes de memória estão sendo usados ​​pelo serviço.
  • O grupo de controle inclui o script “htg.sh” e o sleepcomando, que foi iniciado por “htg.sh.” Na maioria das vezes, o sleepcomando fará o trabalho para este serviço.

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

Parando e desabilitando o serviço

Se você precisar interromper o serviço, poderá fazer isso com este comando:

sudo systemctl stop htg.service

sudo systemctl stop htg.service em uma janela de terminal

Isso interrompe o serviço, mas não o impede de reiniciar na próxima vez que o computador for reiniciado. Para parar o serviço que está sendo lançado na inicialização, você precisa desativá- lo:

sudo systemctl disable htg.service

sudo systemtctl disable htg.service em uma janela de terminal

Se o serviço estiver em execução, este comando não o interrompe. Ele simplesmente informa systemdpara não iniciar o serviço na próxima reinicialização.

Se você deseja interromper o serviço e evitar 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.