![另一个进程可以向 systemd 发出信号来重新启动服务吗?](https://linux22.com/image/776859/%E5%8F%A6%E4%B8%80%E4%B8%AA%E8%BF%9B%E7%A8%8B%E5%8F%AF%E4%BB%A5%E5%90%91%20systemd%20%E5%8F%91%E5%87%BA%E4%BF%A1%E5%8F%B7%E6%9D%A5%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1%E5%90%97%EF%BC%9F.png)
我们有一个由 管理的服务systemd
。我正在寻找一种以编程方式按需重新启动该服务的方法 - 例如,通过发送信号、写入文件或通过套接字发送消息。
背景:systemd
托管服务维护着一个无头 chrome 实例池。但它对它们的管理有些糟糕,随着时间的推移,它们的数量和内存使用量都会增加。Asystemctl restart
解决了这个问题。
我可以设置RuntimeMaxSec
并Restart=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 信号。