我正在编写一个应该启动 LTE 连接的服务。
但是我用来连接的实用程序 (sakis3g) 正在写入/dev/stderr,这在 systemd 中不可用,并且日志中充满了
Cannot create /dev/stderr: No such device or address
Run Code Online (Sandbox Code Playgroud)
有没有办法解决它?
不幸的是,更改实用程序脚本/二进制文件不是一种选择。
编辑:这是服务:
[Unit]
Description=LTE
After=syslog.target network-online.target
Before=openvpn-client@client
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/mav/LTE/
ExecStartPre=/sbin/ip link set wwan0 down
ExecStart=/opt/mav/LTE/sakis3g connect -g --sudo
ExecStop=/opt/mav/LTE/sakis3g disconnect --sudo
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
它在这种状态下工作。但是当我开始sakis3g使用-g标志以获得更详细的调试输出时,就会stderr出现错误。
如果没有 stderr,您就不会看到错误。
在这里,错误是关于无法打开的/dev/stderr文件,该文件在Linux是一个符号链接指向该文件是开放在FD 2(而在其他系统上,开放的/ dev /标准错误是像做了dup(2))。
这里的问题很可能是 fd 2 在套接字(inet TCP、Unix 流或其他)上打开,而您不能open()打开套接字文件。
如果你运行:
sudo lsof -aU +E -d 2
Run Code Online (Sandbox Code Playgroud)
在系统上使用 systemd您会注意到大多数服务的 fd 2 是一个 unix 域流套接字到systemd-journald.
作为一种解决方法,您可以将其启动为:
bash -o pipefail -c '{ /opt/mav/LTE/sakis3g connect -g --sudo 2>&1 >&3 3>&- | cat >&2 3>&-; } 3>&1'
Run Code Online (Sandbox Code Playgroud)
那就是让 stderr 成为一个管道(到cat)而不是一个套接字,cat将它在管道上接收到的内容转发到原始 stderr(套接字),并确保我们使用pipefail选项保留命令的退出状态。
在任何情况下,它的来源sakis3g都是可用的,并且该sakis3ginit 文件是一个 bash 脚本,恰好是这样:
echo text >> /dev/stderr
Run Code Online (Sandbox Code Playgroud)
代替:
echo test >&2
Run Code Online (Sandbox Code Playgroud)
它甚至有几个> /dev/stderr而不是>> /dev/stderr哪个更错误。它没有tee -a /dev/stderr | other cmd哪个将是合法使用/dev/stderr并且也不能在套接字上与 stderr 一起使用,因此它很容易修复。
您可能希望通过在https://github.com/Trixarian/sakis3g-source/issues提出问题来让他们知道这个问题
| 归档时间: |
|
| 查看次数: |
2464 次 |
| 最近记录: |