Systemd 套接字啟動:關閉套接字時殺死 bash 腳本

Systemd 套接字啟動:關閉套接字時殺死 bash 腳本

假設一個最小的例子,如這個問題,除了另一個 shell 腳本。

[電子郵件受保護]:

[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.socket

[Unit]
Description=Foo Socket
[email protected]

[Socket]
ListenStream=127.0.0.1:7780
Accept=Yes

[Install]
WantedBy=sockets.target

/opt/foo/foo.sh

#!/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 讀取或輪詢它以檢查它是否已關閉。

相關內容