Outro processo pode sinalizar ao systemd para reiniciar um serviço?

Outro processo pode sinalizar ao systemd para reiniciar um serviço?

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 systemdserviç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 restartcorrige isso.

Eu poderia configurar RuntimeMaxSece Restart=alwaysreiniciar 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 sudoersarquivo ( 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 reloadtambém envia um sinal SIGHUP para o processo.

informação relacionada