¿Puede otro proceso indicarle a systemd que reinicie un servicio?

¿Puede otro proceso indicarle a systemd que reinicie un servicio?

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 systemdservicio 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 restartsoluciona eso.

Podría configurar RuntimeMaxSecy Restart=alwaysreiniciar 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 sudoersarchivo ( 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 reloadtambién envía una señal SIGHUP al proceso.

información relacionada