Kann ein anderer Prozess systemd signalisieren, einen Dienst neu zu starten?

Kann ein anderer Prozess systemd signalisieren, einen Dienst neu zu starten?

Wir haben einen Dienst, der von verwaltet wird systemd. Ich suche nach einer Möglichkeit, diesen Dienst bei Bedarf programmgesteuert neu zu starten – beispielsweise durch Senden eines Signals, Schreiben in eine Datei oder Senden einer Nachricht über einen Socket.

Kontext: Der systemdverwaltete Dienst verwaltet einen Pool von Headless-Chrome-Instanzen. Die Verwaltung dieser Instanzen ist jedoch nicht sehr effektiv und mit der Zeit nehmen ihre Anzahl und ihr Speicherverbrauch zu. A systemctl restartbehebt dieses Problem.

Ich könnte den Proxy RuntimeMaxSecso einstellen Restart=always, dass er regelmäßig neu gestartet wird, aber möglicherweise ist er zum Zeitpunkt des Neustarts bereits aktiv.

Ein anderer Dienst auf dieser Maschine ist der einzige Nutzer des Chrome-Proxys und weiß, wann er ihn nicht verwendet. Wenn er den Chrome-Proxy also regelmäßig nicht verwendet (damit keine Anfragen verloren gehen), könnte er ihn neu starten.

Wie könnte ich das tun?

Antwort1

Eine Lösung besteht darin, den anderen Dienst tatsächlich auszuführen systemctl restart some_service. Dies erfordert sudo, aber es ist möglich, die sudoersDatei ( visudo) zu verwenden, um einem Benutzer die Berechtigung zum Ausführen eines bestimmten Befehls zu erteilen:some-user ALL=NOPASSWD: /some/command some args

Antwort2

Wenn Sie sudo vermeiden möchten, können Sie das Linger-Flag Ihres Benutzers setzen und einen Benutzerdienst anstelle eines Systemdienstes erstellen. Dies funktioniert möglicherweise nicht unter CentOS 7 oder niedriger.

Eine andere Lösung besteht darin, systemctl nach der PID zu fragen

systemctl --user status your_scraper

dann senden Sie ein SIGHUP an diese Prozess-ID

os.kill(main_pid_of_your_scraper, signals.SIGHUP)

die Sie in Ihrer Anwendung abfangen und Ihren Browser zurücksetzen müssen.

signal.signal(signal.SIGHUP, restart_myself)

Dies funktioniert auch gut mit systemcl, da systemctl reloadauch ein SIGHUP-Signal an den Prozess gesendet wird.

verwandte Informationen