另一個程序可以向 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 訊號。

相關內容