
我們有一項由 管理的服務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 訊號。