Linux

空閒時間後停用 systemd 服務

  • May 3, 2022

我希望服務按需啟動,而不是在啟動時啟動。為此,我可以使用 systemd 套接字啟動(使用服務和套接字文件)。

但這是一個資源有限的伺服器,所以在一段時間(例如 1 小時)不活動後,我想停止服務(直到它再次被觸發)。我怎樣才能做到這一點?

我查看了一些文件,但我無法確定這是否受支持。


更新:

假設這是不受支持的,案例可能仍然很常見。什麼是實現這一目標的好方法/解決方法?

systemd 中的套接字啟動可以在兩種模式下工作:

  • Accept=true: systemd 保持監聽套接字,接受每個傳入的連接,為每個連接生成一個新程序並將已建立的套接字傳遞給它。這種情況是微不足道的(每個程序在完成後退出)。
  • Accept=false: systemd 創建監聽套接字並監視它的傳入連接。一旦有人進來,systemd 就會生成服務並將偵聽套接字傳遞給它。然後服務接受傳入連接和任何後續連接。Systemd 不再跟踪套接字上發生的事情,因此它無法檢測到不活動。

在後一種情況下,我認為唯一真正乾淨的解決方案是修改應用程序,使其在空閒一段時間後退出。如果你不能這樣做,一個粗略的解決方法可能是設置 cron 或 systemd 計時器來每小時終止一次服務。如果服務只是很少產生,這可能是一個合理的近似值。

請注意,案例可能非常罕見。位於 poll()/select() 中等待連接的程序不會消耗任何 CPU 時間,因此在這種情況下使用的唯一資源是記憶體。僅設置一些交換並讓核心決定是否值得將程序始終保留在 RAM 中可能更容易也更有效。

引用自:https://unix.stackexchange.com/questions/470880