
Temos um serviço gerenciado por systemd
. Estou procurando uma maneira de reiniciar programaticamente esse serviço sob demanda - por exemplo, enviando um sinal, gravando em um arquivo ou enviando mensagens por um soquete.
Contexto: o systemd
serviço gerenciado mantém um conjunto de instâncias headless do Chrome. Mas ele os gerencia de maneira um tanto deficiente e, com o tempo, eles aumentam em número e uso de memória. A systemctl restart
corrige isso.
Eu poderia configurar RuntimeMaxSec
e Restart=always
reiniciar o proxy periodicamente, mas ele pode estar funcionando no momento em que ocorre a reinicialização.
Outro serviço nessa máquina é o único consumidor do proxy chrome e sabe quando não o está usando. Então, periodicamente, quando não estiver usando o proxy do Chrome (para que nenhuma solicitação seja descartada), ele poderá reiniciá-lo.
Como eu poderia fazer isso?
Responder1
Uma solução é fazer com que o outro serviço seja realmente executado systemctl restart some_service
. Isso requer sudo
, mas é possível usar o sudoers
arquivo ( visudo
) para dar permissão ao usuário para executar um comando específico:some-user ALL=NOPASSWD: /some/command some args
Responder2
Se quiser evitar o sudo, você pode definir o sinalizador de permanência do usuário e criar um serviço de usuário em vez de um serviço de sistema. Isso pode não funcionar no centos 7 ou inferior.
Outra solução é perguntar ao systemctl qual é o PID
systemctl --user status your_scraper
em seguida, envie um SIGHUP para esse ID de processo
os.kill(main_pid_of_your_scraper, signals.SIGHUP)
que você precisa capturar dentro do seu aplicativo e redefinir o navegador.
signal.signal(signal.SIGHUP, restart_myself)
Isso também funciona bem com o systemcl, pois systemctl reload
também envia um sinal SIGHUP para o processo.