另一个进程可以向 systemd 发出信号来重新启动服务吗?

另一个进程可以向 systemd 发出信号来重新启动服务吗?

我们有一个由 管理的服务systemd。我正在寻找一种以编程方式按需重新启动该服务的方法 - 例如,通过发送信号、写入文件或通过套接字发送消息。

背景:systemd托管服务维护着一个无头 chrome 实例池。但它对它们的管理有些糟糕,随着时间的推移,它们的数量和内存使用量都会增加。Asystemctl restart解决了这个问题。

我可以设置RuntimeMaxSecRestart=always定期重新启动代理,但它可能在重新启动时正在工作。

该机器上的另一个服务是 chrome 代理的唯一使用者,并且知道何时不使用它。因此,当它不使用 chrome 代理时(这样就不会丢弃任何请求),它可以定期重新启动它。

我怎能这样做?

答案1

一种解决方案是让其他服务实际运行systemctl restart some_service。这需要sudo,但可以使用sudoers文件(visudo)授予用户运行某个特定命令的权限:some-user ALL=NOPASSWD: /some/command some args

答案2

如果您想避免使用 sudo,您可以设置用户的 linger 标志并创建用户服务而不是系统服务。这可能不适用于 centos 7 或更低版本。

另一个解决方案是询问 systemctl PID 是什么

systemctl --user status your_scraper

然后向该进程 ID 发送 SIGHUP

os.kill(main_pid_of_your_scraper, signals.SIGHUP)

您需要在应用程序中捕获它并重置浏览器。

signal.signal(signal.SIGHUP, restart_myself)

这也与 systemcl 配合得很好,因为它systemctl reload也向进程发送了 SIGHUP 信号。

相关内容