Como executar um programa Linux na inicialização com systemd
Publicados: 2022-01-29Precisa 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 iniciados na inicialização são controlados pelo systemd
, o gerenciador de sistema e serviço. systemd
é o primeiro processo a ser executado na inicialização. Ele sempre tem o 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.
Programas executados em segundo plano são chamados de daemons 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
, a interface de controle parasystemd
- 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.
toque em htg.sh
gedit htg.sh
O editor gedit
será aberto. Copie e cole o seguinte texto no editor.
#!/bin/bash echo "htg.service: ## Iniciando ##" | 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.
O roteiro não faz muito, mas há alguns pontos que valem a pena notar.
- As duas linhas de
echo
são canalizadas atravéssystemd-cat
, um programa que recebe a saída de um programa e a envia para o diário. 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 /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:
[Unidade] Description=Exemplo de serviço Geek de instruções Deseja=rede.destino 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-usuário.destino
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.
- 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.
systemd
considerará este serviço iniciado assim que o processo especificado peloExecStart
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 aosystemctl
para parar o serviço. Temos esse conjunto para "processar". Isso faz com que osystemd
use o sinalSIGTERM
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.
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 habilitar 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 Kibibytes 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 comandosleep
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 desativar 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.
Comandos Linux | ||
arquivos | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · tipo · renomear · zip · descompactar · montar · umount · instalar · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · converter · rclone · triturar · srm | |
Processos | alias · tela · topo · legal · renice · progresso · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · tempo limite · parede · sim · matar · dormir · sudo · su · tempo · groupadd · usermod · grupos · lshw · desligar · reiniciar · parar · desligar · passwd · lscpu · crontab · data · bg · fg | |
Rede | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
RELACIONADO: Melhores laptops Linux para desenvolvedores e entusiastas