socat可以直接由systemd启动吗?

socat可以直接由systemd启动吗?

下列索卡特在 shell 提示符下输入时,命令行按预期工作:

# /usr/bin/socat UDP-RECV:4321 STDOUT

它侦听 UDP 端口 4321 并将收到的所有内容写入标准输出。

以下是尝试将此命令作为 systemd 服务启动,目的是将接收到的数据写入 systemd 日志(服务标准输出的默认目标):

# /etc/systemd/system/socat.service
[Service]
ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT

但是,当该服务启动时,socat 会立即退出:

Process: 7425 ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT (code=exited, status=0/SUCCESS)

研究这个问题(使用 运行socat-d -d -d -d发现它在标准输出上得到了 EOF:

N starting data transfer loop with FDs [5,5] and [1,1]
N socket 2 (fd 1) is at EOF
I close(5)
N exiting with status 0

可以socat作为systemd服务使用吗?

答案1

该问题是由于socat默认情况下是双向的。它尝试读取其标准输入/dev/null,它得到一个 EOF 并退出。

解决方案是使用以下-u选项:

ExecStart=/usr/bin/socat -u UDP-RECV:4321 STDOUT

UDP-RECV:4321这告诉 socat 从到单向运行STDOUT

相关内容