假设一个最小的例子,如这个问题,除了另一个 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 读取或轮询它以检查它是否已关闭。