socat可以直接用systemd启动吗?

sta*_*fry 8 systemd socat

在 shell 提示符下输入时,以下socat命令行按预期工作:

# /usr/bin/socat UDP-RECV:4321 STDOUT
Run Code Online (Sandbox Code Playgroud)

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

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

# /etc/systemd/system/socat.service
[Service]
ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT
Run Code Online (Sandbox Code Playgroud)

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

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

研究问题(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
Run Code Online (Sandbox Code Playgroud)

是否可以socat用作 systemd 服务?

sta*_*fry 8

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

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

ExecStart=/usr/bin/socat -u UDP-RECV:4321 STDOUT
Run Code Online (Sandbox Code Playgroud)

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