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 读取或轮询它以检查它是否已关闭。

相关内容