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 .
Índice
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 systemd
já foi iniciado.
Os programas executados em segundo plano são chamados daemons ou serviços. O “d” no final de systemd
representa daemon. Neste artigo, criaremos um serviço de exemplo. Para marcar todas as caixas, nosso serviço deve ser:
- Integrado por
systemd
meio 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 systemd
será 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
O gedit
editor 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.
O script não faz muita coisa, mas existem alguns pontos dignos de nota.
- As duas
echo
linhas são canalizadassystemd-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-p
opção (prioridade) para indicar que nossas mensagens são apenas informativas (informações). Não são erros ou avisos importantes. - Existe um
while
ciclo infinito . - A
TIMESTAMP
variá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/bin
diretório.
sudo cp htg.sh / usr / local / bin
E precisamos torná-lo executável:
sudo chmod + x /usr/local/bin/htg.sh
Criação do arquivo de unidade de serviço
Cada programa que é iniciado por systemd
possui um arquivo de definição, denominado arquivo de unidade de serviço. Isso contém certos atributos que systemd
podem 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
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.
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
O gedit
editor 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.
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.
systemd
irá considerar este serviço iniciado assim que o processo especificado porExecStart
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
systemd
devemos encerrar o processo se pedirmossystemctl
para interromper o serviço. Temos isso definido como “processo”. Isso fazsystemd
com que oSIGTERM
sinal 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
Podemos ter systemctl
verificado 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
Nenhum erro é destacado, o que significa que nosso arquivo de unidade está sintaticamente correto.
Iniciando o serviço
Quando você adiciona um novo arquivo de unidade ou edita um existente, você deve informar 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
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 systemctl
com a start
opção.
sudo systemctl start htg
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
O status do serviço é exibido para nós.
- 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
sleep
comando, que foi iniciado por “htg.sh.” Na maioria das vezes, osleep
comando 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
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
Se o serviço estiver em execução, este comando não o interrompe. Ele simplesmente informa systemd
para 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.