AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 470880
Accepted
lonix
lonix
Asked: 2018-09-24 06:23:49 +0800 CST2018-09-24 06:23:49 +0800 CST 2018-09-24 06:23:49 +0800 CST

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

  • 772

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

Mas este é um servidor com recursos limitados, portanto, após algum tempo (por exemplo, 1 hora) de inatividade, quero interromper o serviço (até que seja acionado novamente). Como eu posso fazer isso?

Eu olhei através de alguma 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 alternativa para conseguir isso?

linux systemd
  • 3 3 respostas
  • 2281 Views

3 respostas

  • Voted
  1. Best Answer
    TooTea
    2018-09-27T16:37:04+08:002018-09-27T16:37:04+08:00

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

    • Accept=true: systemd mantém o socket de escuta, aceita todas as conexões de entrada, gera um novo processo para cada conexão e passa o socket estabelecido para ele. Este caso é trivial (cada processo sai quando é feito).
    • Accept=false: systemd cria o soquete de escuta e o observa para 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 quaisquer conexões subsequentes. O Systemd não rastreia mais o que está acontecendo no soquete, portanto, 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 grosseira poderia ser configurar o cron ou um timer systemd para matar 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 tempo de CPU, então o único recurso usado nessa situação é a memória. Provavelmente é mais fácil e 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.

    • 5
  2. Rodney L.
    2022-05-04T02:21:57+08:002022-05-04T02:21:57+08:00

    Se você não pode ajustar o loop principal do seu programa para que ele saia após um certo período sem atividade de soquete, então você pode usar systemd-socket-proxyd, que tem uma opção de tempo limite ocioso.

    Suponha que seu serviço seja chamado thing.service. Ele está escutando em LITEN_ADDR . Você adicionará um serviço que fica entre thing.sockete thing.serviceencaminha conexões de LISTEN_ADDR para PRIVATE_LISTEN_ADDR .

    1. Ajuste a configuração para thingescutar em PRIVATE_LISTEN_ADDR em vez de LISTEN_ADDR . Isso pode ser feito em thing.service, ou talvez em thing.conf- depende do aplicativo.

    2. Configure seu serviço para ser interrompido se nenhuma outra unidade depender dele. Isso pode ser feito definindo StopWhenUnneeded=truena [Unit]seção do seu thing.servicearquivo.

    3. Adicionar thing-proxy.service. Isso faz conexões thing.servicevia PRIVATE_LISTEN_ADDR . Configuramos o tempo limite ocioso aqui para ser de 10 minutos.

      [Unit]
      Requires=thing.service
      After=thing.service
      Requires=thing.socket
      After=thing.socket
      
      [Service]
      ExecStart=/usr/lib/systemd/systemd-socket-proxyd --exit-idle-time=10min PRIVATE_LISTEN_ADDR
      PrivateTmp=yes
      PrivateNetwork=yes
      
    4. Ajuste thing.socketpara que inicie thing-proxy.serviceem vez de thing.service:

      [Socket]
      Accept=false
      ListenStream=LISTEN_ADDR
      Service=thing-proxy.service
      
      [Install]
      WantedBy=sockets.target
      

    Os valores de LISTEN_ADDR e PRIVATE_LISTEN_ADDR podem ser hostname:portpara serviços TCP ou caminhos de soquete de domínio UNIX, ou talvez ambos, dependendo do que você deseja e do que o aplicativo pode fazer. Eles só precisam ser endereços diferentes porque agora você tem dois processos ouvindo conexões.

    • 3
  3. Alexander
    2018-09-27T08:16:48+08:002018-09-27T08:16:48+08:00

    Se o seu serviço for capaz de ser ativado por soquete, você poderá usá-lo Accept=yesna unidade de soquete. Em seguida, uma nova instância do seu serviço seria executada para cada conexão e interrompida quando o soquete fosse fechado.

    • 1

relate perguntas

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve