次のような最小限の例を想定するこの質問ただし、別のシェル スクリプトを除きます。
[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
スクリプトは正しく呼び出されます。しかし、nc
CTRL-C で終了すると、スクリプトは永久に実行されます。
ソケットを閉じるときに、スクリプト プロセスに SIGTERM を送信するメカニズムはありますか (nc
終了時に送信されると想定しています)?
答え1
いいえ、systemd は接続が閉じられてもサービスを停止しません。
これが不可能な理由は、systemd がリッスンしているソケットへの新しい接続を受け入れると、そのソケットを接続を処理するために開始されたサービスに渡し、その接続への参照を保持しなくなるためです。
クライアントによって接続が閉じられたことを検出するには、stdin から読み取るか、ポーリングして閉じられたかどうかを確認することによって、サービス自体からソケットを確認する必要があります。