Systemd ソケットのアクティベーション: ソケットを閉じるときに bash スクリプトを強制終了する

Systemd ソケットのアクティベーション: ソケットを閉じるときに bash スクリプトを強制終了する

次のような最小限の例を想定するこの質問ただし、別のシェル スクリプトを除きます。

[メールアドレス]:

[Unit]
Description=Foo Service
After=network.target systemfoo.socket
Requires=systemfoo.socket

[Service]
Type=oneshot
ExecStart=/bin/bash /opt/foo/foo.sh
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

システムfoo.ソケット

[Unit]
Description=Foo Socket
[email protected]

[Socket]
ListenStream=127.0.0.1:7780
Accept=Yes

[Install]
WantedBy=sockets.target

: := ...

#!/bin/bash

while true; do
    logger -t FOO "Connection received: $REMOTE_ADDR $REMOTE_PORT"
done

経由で接続すると

nc 127.0.0.1 7780

スクリプトは正しく呼び出されます。しかし、ncCTRL-C で終了すると、スクリプトは永久に実行されます。

ソケットを閉じるときに、スクリプト プロセスに SIGTERM を送信するメカニズムはありますか (nc終了時に送信されると想定しています)?

答え1

いいえ、systemd は接続が閉じられてもサービスを停止しません。

これが不可能な理由は、systemd がリッスンしているソケットへの新しい接続を受け入れると、そのソケットを接続を処理するために開始されたサービスに渡し、その接続への参照を保持しなくなるためです。

クライアントによって接続が閉じられたことを検出するには、stdin から読み取るか、ポーリングして閉じられたかどうかを確認することによって、サービス自体からソケットを確認する必要があります。

関連情報