Die Socket-Aktivierung in systemd kann auf zwei Arten funktionieren:
Accept=true
:systemd behält den lauschenden Socket bei, akzeptiert jede eingehende Verbindung, erzeugt für jede Verbindung einen neuen Prozess und übergibt den eingerichteten Socket an ihn. Dieser Fall ist trivial (jeder Prozess wird beendet, wenn er fertig ist).Accept=false
:systemd erstellt den Listening-Socket und überwacht ihn auf eingehende Verbindungen. Sobald einer hereinkommt, spawnt systemd den Dienst und übergibt ihm den Listening-Socket. Der Dienst akzeptiert dann die eingehende Verbindung und alle nachfolgenden. Systemd verfolgt nicht mehr, was auf dem Socket passiert, also kann es keine Inaktivität erkennen.
Im letzteren Fall besteht meiner Meinung nach die einzige wirklich saubere Lösung darin, die Anwendung so zu ändern, dass sie beendet wird, wenn sie einige Zeit inaktiv ist. Wenn Sie das nicht tun können, könnte eine grobe Problemumgehung darin bestehen, cron oder einen systemd-Timer einzurichten, um den Dienst einmal pro Stunde zu beenden. Dies könnte eine vernünftige Annäherung sein, wenn der Dienst nur sehr selten gespawnt wird.
Beachten Sie, dass der Anwendungsfall wahrscheinlich ziemlich selten ist. Ein Prozess, der in poll()/select() sitzt und auf eine Verbindung wartet, verbraucht keine CPU-Zeit, daher ist die einzige Ressource, die in dieser Situation verwendet wird, der Arbeitsspeicher. Es ist wahrscheinlich sowohl einfacher als auch effizienter, einfach einen Swap einzurichten und den Kernel entscheiden zu lassen, ob es sich lohnt, den Prozess die ganze Zeit im RAM zu halten oder nicht.