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.