アイドル時間後のsystemdサービスの無効化

アイドル時間後のsystemdサービスの無効化

起動時にではなく、要求時にサービスを開始したいです。これには、systemdソケットの有効化(サービスとソケットファイルを使用)を使用できます。

ただし、このサーバーはリソースが制限されているため、一定期間(たとえば1時間)アクティビティがない場合は、サービスが再起動されるまでサービスを停止したいと思います。どうすればいいですか?

少し探しました。文書しかし、これがサポートされているかどうかはわかりません。


更新:
これがサポートされていないと仮定すると、ユースケースはまだ一般的かもしれません。これを達成するための良い方法/解決方法は何ですか?

ベストアンサー1

systemdのソケットアクティベーションは2つのモードで動作できます。

  • Accept=true:systemdはリスニングソケットを保持し、着信する各接続を受け入れ、各接続に対して新しいプロセスを作成し、設定されたソケットを渡します。これは簡単です(各プロセスは完了後に終了します)。
  • Accept=false:systemdはリスニングソケットを作成し、着信接続を監視します。誰かが入るとすぐに、systemdはサービスを作成し、リスニングソケットを渡します。その後、サービスは着信接続とその後のすべての接続を受け入れます。 Systemdはソケットで何が起こったのかを追跡しないため、非アクティブ状態を検出できません。

後者の場合、本当にきれいな唯一の解決策は、しばらくアイドル状態になった後に終了するようにアプリケーションを変更することです。これを実行できない場合は、毎時サービスを終了するようにcronまたはsystemdタイマーを設定するのが簡単な回避策です。サービスが頻繁に生成されない場合、これは合理的な近似である可能性があります。

このユースケースは非常にまれです。 poll()/select() で接続を待つプロセスは CPU 時間を消費しないため、この場合に使用される唯一のリソースはメモリです。いくつかのスワッピングを設定し、プロセスを常にRAMに保持する価値があるかどうかをカーネルに決定させる方が簡単で効率的です。

おすすめ記事