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!
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]
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:
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:
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:
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
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!