Arquivo da unidade Systemd Criando um serviço

Arquivo da unidade Systemd Criando um serviço
Gerenciamento de serviços é algo 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 odeia. Quando você cria, por exemplo, um novo programa de servidor que precisa ser executado 24 horas por dia, 7 equipe completa durante anos, de qualquer maneira.

Com seus serviços, o Systemd facilita tudo isso, muito mais fácil. Assim que você quiser algo monitorar seu aplicativo e fácil controle dele, o Systemd é o caminho a percorrer, 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 todo o sistema. Vamos nos concentrar em como o Systemd funciona para serviços de sistema inteiros.

A localização exata depende do porquê e de como o serviço foi instalado. Se o serviço for instalado por um gerenciador de pacotes, ele será geralmente em/usr/lib/systemd/system. Para o software que você desenvolve ou os que não suportam o Systemd, você colocará o arquivo de serviço em/usr/local/lib/systemd/system. Por favor, lembre -se de 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 seguir.

Dentro dessas pastas, você pode encontrar várias extensões de arquivo, como *.soquete, *.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 interromper -o etc. Portanto, geralmente os nomes de arquivos em serviço contém apenas caracteres alfanuméricos, juntamente com hífens e sublinhados. Durante o desenvolvimento, recomendo criá -lo em seus documentos e copiá -lo para o local do SystemD, quando terminar, isso evitaria seus problemas se você economizar 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: consulte o potencial relatório de bugs na seção de comentários desta postagem do blog]

[Unidade]
Descrição = Penguins Web Application HTTP Server (em execução na porta 8080)
WantedBy = MultiUser.alvo
[Serviço]
Tipo = simples
Execstart =/usr/bin/python3/usr/local/bin/penguin-web-app/main.py
Reinicie = sempre

O formato de arquivo está de fato perto de ini. Eu sei que pode ser estranho, pois os arquivos ini são frequentemente encontrados no Windows, mas é assim que funciona. O arquivo de serviço é dividido pela primeira vez 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 da unidade Systemd, enquanto o [serviço] é apenas para configuração específica para configurar um novo serviço.

Em seguida, a seção é configurada com propriedades como descrição = ou execstart =. O valor é separado do nome da propriedade pelo sinal igual = sem 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. Systemd irá reiniciá-lo sempre que o processo sair e iniciar o servidor após a inicialização do servidor, se você ativar o comando SystemCtl Ativar. Cool eh?

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

Propriedades dos Serviços Systemd

Vamos primeiro focar sobre as propriedades na [unidade]:

Descrição = é apenas dar uma descrição clara do que o serviço está fazendo. Ele é exibido na lista de serviços, registros de serviços para que você seja descritivo, mas deve permanecer em uma linha e uma frase.

Wantedby = permite dizer ao Systemd: Quando essa coisa é iniciada, me inicia. Geralmente você coloca o nome de um alvo. Exemplos de metas comuns:

  1. multi usuário.Alvo: quando o servidor está ok e está pronto para executar aplicativos de linha de comando
  2. gráfico.Alvo: quando Gnome ou Kde está pronto
  3. rede-up.Alvo: quando o servidor está conectado corretamente a uma rede

Ok para o início, essas propriedades de [unidade] são suficientes. Vamos dar uma olhada no [serviço] agora.

Type = ajuda o Systemd em como saber se um serviço está em execução. Aqui estão os tipos comuns:

  1. Simples é provavelmente o mais comumente usado: o Systemd considera o processo que você inicia como o que faz o serviço. Se o processo parar, considera que o serviço também parou, etc.
  2. A bobina é preferida para aplicativos que foram escritos para serem um servidor, mas sem a ajuda de um sistema de gerenciamento de serviços. Basicamente. Para ser mais preciso, você também pode ajudar o Systemd com um arquivo PID, onde o PID do processo a ser rastreado é escrito pelo aplicativo lançado.

ExecStart = é provavelmente o mais importante para um serviço: Precisa qual aplicativo lançar 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 usar caminhos absolutos para evitar surpresas.

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

Execstart =/usr/bin/bash/usr/local/bin/lance-Penguin-server.sh

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

Reiniciar = permite que você diga explicitamente quando o serviço deve ser reiniciado. Essa é uma das características importantes do Systemd: garante que seu serviço permaneça o tempo que você deseja, então preste muita atenção a esta opção.

Reiniciar = Significado
sempre Systemd continuará reiniciando sempre que terminar ou travar. Bem, até que você faça o nome do SystemCTL Stop Service-Name.serviço.

É perfeito para servidores e serviços on -line, pois você prefere poucos reinicializações inúteis a ter que reiniciar manualmente o serviço sem qualquer motivo.

on-abnormal Quando o processo de serviço travar, reinicie o serviço. No entanto, se o aplicativo sair de forma limpa, não o reinicie.

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

em falha Muito parecido com o on-abnorma. Códigos de saída diferentes de zero geralmente significam um erro.
não Systemd não reiniciará o serviço automaticamente.

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

WorkingDirectory = pode aplicar 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, poderia ser:

WorkingDirectory =/Srv/Penguin-Web-App/

Então, a segurança é importante para que você geralmente não queira lançar seu serviço com privilégios de raiz. Usuário = e grupo = permite definir o nome do usuário ou grupo ou UID/GID sob o qual seu aplicativo será lançado. Por exemplo:

Usuário = Penguin-Web
Grupo = Pinguim-Web

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

  1. O aplicativo pode ler diretamente a variável do ambiente.
  2. Mas também você pode definir diferentes argumentos da 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 igual = e depois seu valor. Então você coloca o caminho absoluto do seu arquivo de ambiente na propriedade EnvironmentFile.

Então, exemplo:

EnvironmentFile =/etc/pinguim-web-app/ambiente

E o arquivo/etc/pinguim-web-app/ambiente contém:

Ouvir_port = 8080

Em seguida, nosso aplicativo da web do Penguins terá acesso à variável de ambiente de escuta e ouvir a porta esperada.

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

Então, se você seguiu meu conselho, editou seu arquivo de serviço no diretório da sua casa. Depois de satisfeito, copie esse arquivo para/usr/local/lib/Systemd/System, assumindo que sua distribuição suporta esse caminho. O nome do arquivo do seu arquivo de serviço será o nome de seu serviço. Este nome de arquivo tem que terminar com .serviço. Por exemplo, para o nosso servidor Penguins, seria Penguin-Web-App.serviço.

Então, você deve dizer ao SystemD que adicionou um novo serviço, para que você precise digitar este comando:

$ sudo systemctl daemon -load

Ok, agora o Systemd está ciente do seu novo serviço, assumindo que seu arquivo não contenha um erro de sintaxe. Afinal, é o seu primeiro arquivo, então é provável que você cometer erros. Você tem que executar este comando acima em todas as atualizações do seu arquivo de serviço.

Agora, hora de iniciar o serviço:

$ sudo SystemCtl Start Penguin-Web-App.serviço

Se falhar com uma unidade não encontrada erro como este:

$ sudo SystemCtl Start Penguin-Web-App.serviço
Falhou ao iniciar o pinguim-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 o seu arquivo de serviço. Não deixe de conferir.

Se você configurar seu serviço com wanteby = e desejar que seu serviço inicie automaticamente, você deve ativá -lo, com este comando:

$ sudo systemctl Ativar pinguim-web-app.serviço

O legal com um serviço é que ele é executado em segundo plano. O problema: como saber se é executado corretamente e se estiver em execução, se estiver funcionando em segundo plano? Não se preocupe, a equipe do Systemd também pensou nisso e forneceu um comando para ver se é executado corretamente, pois quanto tempo, etc:

$ Systemctl Status Penguin-Web-App.serviço

Conclusão

Parabéns! Agora você pode ter seus aplicativos gerenciados sem que você se importe em reiniciá -lo manualmente todas as vezes. Agora, eu recomendo que você leia nosso outro artigo sobre os logs do Systemd: Master JournalCtl: Entenda os logs do Systemd. Com isso, você pode usar o poderoso sistema de registro em seu novo serviço e criar servidores mais confiáveis!