
Disponemos de un servicio gestionado por systemd
. Estoy buscando una manera de reiniciar ese servicio mediante programación a pedido, por ejemplo, enviando una señal, escribiendo en un archivo o enviando mensajes a través de un socket.
Contexto: el systemd
servicio administrado mantiene un grupo de instancias de Chrome sin cabeza. Pero los gestiona un poco mal y, con el tiempo, aumentan en número y uso de memoria. A systemctl restart
soluciona eso.
Podría configurar RuntimeMaxSec
y Restart=always
reiniciar el proxy periódicamente, pero es posible que esté funcionando en el momento en que se produce el reinicio.
Otro servicio en esa máquina es el único consumidor del proxy de Chrome y sabe cuándo no lo está usando. Entonces, periódicamente, cuando no esté usando el proxy de Chrome (para que no se eliminen solicitudes), podría reiniciarlo.
¿Cómo podría hacer eso?
Respuesta1
Una solución es ejecutar el otro servicio systemctl restart some_service
. Eso requiere sudo
, pero es posible usar el sudoers
archivo ( visudo
) para otorgar permiso al usuario para ejecutar un comando específico:some-user ALL=NOPASSWD: /some/command some args
Respuesta2
Si desea evitar sudo, puede configurar el indicador persistente de su usuario y crear un servicio de usuario en lugar de un servicio del sistema. Es posible que esto no funcione en centos 7 o inferior.
Otra solución es preguntarle a systemctl cuál es el PID.
systemctl --user status your_scraper
luego envíe un SIGHUP a esa identificación de proceso
os.kill(main_pid_of_your_scraper, signals.SIGHUP)
que debe capturar dentro de su aplicación y restablecer su navegador.
signal.signal(signal.SIGHUP, restart_myself)
Esto también funciona muy bien con systemcl, ya que systemctl reload
también envía una señal SIGHUP al proceso.