假設一個最小的例子,如這個問題,除了另一個 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 讀取或輪詢它以檢查它是否已關閉。