systemd

arquivo de unidade systemd criando um serviço

arquivo de unidade systemd criando um serviço
O gerenciamento de serviços é algo em que você nem pensa quando usa sua estação de trabalho Linux ou servidor Linux todos os dias, mas quando não estiver lá, você realmente odiará. Quando você cria, por exemplo, um novo programa de servidor que precisa ser executado 24 horas por dia, 7 dias por semana, fazer este desafio sem gerenciamento de serviço é um pesadelo onde você mesmo cria um pequeno sistema de serviço, que obviamente não será tão bom quanto o gerente desenvolvido por um equipe completa durante anos, de qualquer maneira.

Com seus serviços, o systemd torna tudo isso mais fácil, muito mais fácil. Assim que você quiser que algo monitore seu aplicativo e controle fácil dele, o systemd é o caminho a seguir, e é isso que vou explicar aqui!

Onde estão os serviços Systemd

Para adicionar um novo serviço, bem, você precisa responder a esta pergunta. Como sempre no systemd, depende se o serviço é apenas para o seu usuário ou para todo o sistema. Vamos nos concentrar em como o systemd funciona para todos os serviços do sistema.

A localização exata depende de por que e como o serviço foi instalado. Se o serviço for instalado por um gerenciador de pacotes, geralmente estará em / usr / lib / systemd / system. Para software que você desenvolve ou aqueles que não suportam systemd por si só, você colocará o arquivo de serviço em / usr / local / lib / systemd / system. Por favor, tenha em mente que algumas distribuições não suportam esta pasta em / usr / local. Finalmente, se você deseja configurar um serviço systemd existente, / etc / systemd / system é o caminho a percorrer.

Dentro dessas pastas, você pode encontrar várias extensões de arquivo, como *.socket, *.alvo ou *.serviço. Obviamente, vamos nos concentrar no último. systemd usa o nome do arquivo como o nome do serviço ao iniciá-lo ou interrompê-lo etc. Portanto, geralmente os nomes de arquivos em serviço contêm apenas caracteres alfanuméricos junto com hifens e sublinhados. Durante o desenvolvimento eu recomendo criá-lo em seus documentos e depois copiá-lo para o local do systemd quando terminar, isso evitaria problemas se você salvasse no meio da edição.

OK, então, crie seu arquivo de serviço em seus documentos. Agora estamos prontos para revisar como escrever este arquivo.
[Nota: Ver relatório de bug potencial na seção de comentários desta postagem do blog]

[Unidade]
Descrição = Servidor HTTP Penguins Web Application (em execução na porta 8080)
WantedBy = multiusuário.alvo
 
[Serviço]
Tipo = simples
ExecStart = / usr / bin / python3 / usr / local / bin / penguin-web-app / main.py
Reiniciar = sempre

O formato do arquivo é, na verdade, próximo ao ini. Eu sei que pode ser estranho, já que os arquivos ini costumam ser encontrados no Windows, mas é assim que funciona. O arquivo de serviço é primeiro dividido em 2 seções: [Unidade] e [Serviço]. Cada seção configura um aspecto específico do systemd: [Unidade] contém elementos compartilhados por todos os arquivos de unidade do systemd enquanto [Serviço] é apenas para configuração específica para configurar um novo serviço.

Em seguida, a seção é configurada com propriedades como Description = ou ExecStart =. O valor é separado do nome da propriedade pelo sinal de igual = sem nenhum espaço.

Vamos voltar ao arquivo mostrado acima. Ele descreve um serviço projetado para executar um aplicativo da web escrito em Python sobre pinguins. O systemd irá reiniciá-lo sempre que o processo sair e iniciar o servidor na inicialização do servidor se você habilitá-lo com o comando systemctl enable. Legal eh?

Mas talvez seu próximo aplicativo da web não seja sobre pinguins - e isso é uma pena - e não está escrito em Python. Neste caso, você deseja aprender mais sobre as configurações possíveis.

Propriedades dos serviços Systemd

Vamos primeiro nos concentrar nas propriedades em [Unit]:

Description = trata-se apenas de fornecer uma descrição clara do que o serviço está fazendo. Ele é exibido na lista de serviços, registros de serviços, então você deseja que seja descritivo, mas deve permanecer em uma linha e uma frase.

WantedBy = permite dizer ao systemd: quando isso for iniciado, eu também inicio. Geralmente você colocará o nome de um alvo. Exemplos de alvos comuns:

  1. multi usuário.destino: quando o servidor está OK e pronto para executar aplicativos de linha de comando
  2. gráfico.alvo: quando o GNOME ou KDE estiver pronto
  3. rede.alvo: quando o servidor está conectado corretamente a uma rede

OK para o início essas propriedades de [Unidade] é o suficiente. Vamos dar uma olhada em [Serviço] agora.

Type = ajuda o systemd a saber se um serviço está sendo executado. Aqui estão os tipos comuns:

  1. simples é provavelmente o mais comumente usado: o systemd considera o processo que você inicia como o que está fazendo o serviço. Se o processo parar, ele considera o serviço interrompido também, etc.
  2. bifurcação é preferível para aplicativos que foram escritos para ser um servidor, mas sem a ajuda de um sistema de gerenciamento de serviço. Basicamente, ele espera que o processo lançado bifurque e essa bifurcação seja considerada o processo final para o serviço. Para ser mais preciso, você também pode ajudar o systemd com um arquivo PID, onde o PID do processo a rastrear é escrito pelo aplicativo iniciado.

ExecStart = é provavelmente o mais importante para um serviço: ele especifica qual aplicativo deve ser iniciado ao iniciar o serviço. Como você pode ver no serviço Penguin, usei / usr / bin / python3 e não python3 imediatamente. É porque a documentação do systemd recomenda explicitamente o uso de caminhos absolutos para evitar surpresas.

Mas isso também é por outro motivo. O sistema de gestão de outros serviços tende a ser baseado em scripts Shell. No entanto, o systemd, por motivos de desempenho, não executa um shell por padrão. Portanto, você não pode fornecer diretamente um comando shell em ExecStart =. No entanto, você ainda pode usar um script de shell fazendo:

ExecStart = / usr / bin / bash / usr / local / bin / launch-penguin-server.sh

Não é tão difícil né? Observe que se você precisar executar algum processo para sinalizar que seu serviço pare de forma limpa, ExecStop = existe, bem como ExecReload = para recarregar serviços.

Reiniciar = permite que você diga explicitamente quando o serviço deve ser reiniciado. Este é um dos recursos importantes do systemd: ele garante que seu serviço permaneça ativo pelo tempo que você deseja, então preste muita atenção a esta opção.

Reiniciar = Significado
sempre O systemd continuará reiniciando-o sempre que terminar ou travar. Bem, até você fazer systemctl stop service-name.serviço.

É perfeito para servidores e serviços online, pois você prefere poucas reinicializações inúteis em vez de reiniciar manualmente o serviço sem qualquer motivo.

anormal Quando o processo do serviço falhar, reinicie o serviço. No entanto, se o aplicativo sair de forma limpa, não reinicie-o.

É mais útil para cron-jobs como serviços que precisam fazer uma tarefa de maneira confiável, mas não precisam ser executados o tempo todo.

em caso de falha Muito parecido com anormal, mas também reinicia o serviço quando o aplicativo sai de forma limpa, mas com um código de saída diferente de zero. Códigos de saída diferentes de zero geralmente significam que ocorreu um erro.
não systemd não irá reiniciar o serviço automaticamente.

Geralmente útil para obter acesso a outros recursos do systemd, como registro sem o recurso de reinicialização.

WorkingDirectory = pode impor um diretório de trabalho ao iniciar seu aplicativo. O valor deve ser um caminho de diretório absoluto. O diretório de trabalho é usado quando você usa caminhos relativos no código do seu aplicativo. Para o nosso serviço de pinguins, pode ser:

WorkingDirectory = / srv / penguin-web-app /

Então, a segurança é importante, então geralmente você não deseja iniciar seu serviço com privilégios de root. Usuário = e Grupo = permite que você defina o nome do usuário ou grupo ou UID / GID sob o qual seu aplicativo será iniciado. Por exemplo:

User = penguin-web
Grupo = web-pinguim

EnvironmentFile = é uma opção poderosa. Os aplicativos executados como serviços geralmente precisam de configuração e os arquivos de ambiente permitem definir essa configuração de duas maneiras:

  1. O aplicativo pode ler diretamente a variável de ambiente.
  2. Mas você também pode definir diferentes argumentos de linha de comando para o seu aplicativo sem alterar o arquivo de serviço.

A sintaxe deste arquivo é simples: você digita o nome da variável de ambiente, o sinal de igual = e então seu valor. Então você coloca o caminho absoluto do seu arquivo de ambiente na propriedade EnvironmentFile.

Então, exemplo:

EnvironmentFile = / etc / penguin-web-app / environment

E o arquivo / etc / penguin-web-app / environment contém:

LISTEN_PORT = 8080

Então, nosso aplicativo da web de pinguins terá acesso à variável de ambiente LISTEN_PORT e ouvirá a porta esperada.

Salve e inicie o serviço Systemd recém-criado

Então, se você seguiu meu conselho, editou seu arquivo de serviço em seu diretório inicial. Quando estiver satisfeito, copie esse arquivo para / usr / local / lib / systemd / system, assumindo que sua distribuição suporte esse caminho. O nome do arquivo do seu serviço será o nome do serviço. Este nome de arquivo deve terminar com .serviço. Por exemplo, para nosso servidor de pinguins, seria penguin-web-app.serviço.

Então, você tem que dizer ao systemd que adicionou um novo serviço, então você precisa digitar este comando:

$ sudo systemctl daemon-reload

Ok, agora o systemd está ciente do seu novo serviço, assumindo que seu arquivo não contém um erro de sintaxe. Afinal, é o seu primeiro arquivo, então é provável que você cometa erros. Você deve executar este comando acima em cada atualização em seu arquivo de serviço.

Agora, é hora de iniciar o serviço:

$ sudo systemctl iniciar penguin-web-app.serviço

Se falhar com um erro Unidade não encontrada, como este:

$ sudo systemctl iniciar penguin-web-app.serviço
Falha ao iniciar penguin-web-app.serviço: Unidade não encontrada.

Isso significa que sua distribuição não suporta o diretório ou você não nomeou corretamente seu arquivo de serviço. Certifique-se de verificar.

Se você configurou seu serviço com WantedBy = e deseja que seu serviço inicie automaticamente, você deve habilitá-lo, com este comando:

$ sudo systemctl enable penguin-web-app.serviço

O legal de um serviço é que ele roda em segundo plano. O problema: como saber se funciona corretamente e se está funcionando em segundo plano? Não se preocupe, a equipe do systemd pensou nisso também e forneceu um comando para ver se funciona corretamente, desde quanto tempo, etc:

$ systemctl status penguin-web-app.serviço

Conclusão

Parabéns! Agora você pode ter seus aplicativos gerenciados sem se preocupar em reiniciá-los manualmente todas as vezes. Agora, recomendo que você leia nosso outro artigo sobre logs do systemd: Master journalctl: compreender logs do systemd. Com isso, você pode usar o poderoso sistema de registro em seu novo serviço e construir servidores mais confiáveis!

Como aumentar o FPS no Linux?
FPS significa Quadros por segundo. A tarefa do FPS é medir a taxa de quadros em reproduções de vídeo ou desempenho de jogos. Em palavras simples, o nú...
Top jogos do Oculus App Lab
Se você é proprietário de um fone de ouvido Oculus, deve estar informado sobre o carregamento lateral. Sideload é o processo de instalação de conteúdo...
Os 10 melhores jogos para jogar no Ubuntu
A plataforma Windows tem sido uma das plataformas dominantes para jogos devido à grande porcentagem de jogos que estão sendo desenvolvidos hoje para o...