Desativar um serviço systemd após o tempo inativo

2

Eu quero que um serviço seja iniciado por demanda, e não por inicialização. Para fazer isso eu poderia usar a ativação do soquete systemd (com os arquivos de serviço e soquete).

Mas esse é um servidor limitado por recursos, portanto, depois de algum tempo (por exemplo, 1 hora) de inatividade, eu quero parar o serviço (até que ele seja acionado novamente). Como posso fazer isso?

Analisei algumas documentação , mas não consigo descobrir se isso é suportado.

Atualização:
Supondo que isso não seja suportado, o caso de uso provavelmente ainda é bastante comum. Qual seria uma boa maneira / solução para alcançar isso?

    
por lonix 23.09.2018 / 16:23

2 respostas

1

A ativação do soquete no systemd pode funcionar em dois modos:

  • Accept=true : systemd mantém o soquete de escuta, aceita todas as conexões de entrada, gera um novo processo para cada conexão e passa o soquete estabelecido para ele. Este caso é trivial (cada processo sai quando é feito).
  • Accept=false : systemd cria o soquete de escuta e assiste a conexão de entrada. Assim que um entra, o systemd gera o serviço e passa o soquete de escuta para ele. O serviço então aceita a conexão de entrada e as subsequentes. O Systemd não rastreia mais o que está acontecendo no soquete, por isso não pode detectar inatividade.

No último caso, acho que a única solução realmente limpa é modificar o aplicativo para que ele saia quando estiver ocioso por algum tempo. Se você não puder fazer isso, uma solução alternativa poderia ser configurar o cron ou um timer do systemd para eliminar o serviço uma vez por hora. Isso pode ser uma aproximação razoável se o serviço for gerado com pouca frequência.

Observe que o caso de uso é provavelmente muito raro. Um processo sentado em poll () / select () esperando por uma conexão não consome nenhum tempo de CPU, então o único recurso usado nessa situação é a memória. É provavelmente mais fácil e mais eficiente apenas configurar alguma troca e deixar o kernel decidir se vale a pena manter o processo na RAM o tempo todo ou não.

    
por 27.09.2018 / 02:37
1

Se o seu serviço puder ser ativado por soquete, você poderá usar Accept=yes na unidade do soquete. Em seguida, uma nova instância do seu serviço seria executada para cada conexão e interrompida quando o soquete for fechado.

    
por 26.09.2018 / 18:16