在 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 服务?
问题是由于socat
默认情况下是双向的。它尝试读取它的标准输入,即/dev/null
,它得到一个 EOF 并退出。
解决方案是使用该-u
选项:
ExecStart=/usr/bin/socat -u UDP-RECV:4321 STDOUT
Run Code Online (Sandbox Code Playgroud)
这告诉 socat 从UDP-RECV:4321
to单向运行STDOUT
。
归档时间: |
|
查看次数: |
9912 次 |
最近记录: |