【发布时间】:2020-06-16 03:48:54
【问题描述】:
我有一个 go 二进制文件,它使用 cmd := exec.Command("xdpyinfo") 然后调用 cmd.Output() 获取显示信息。
该程序在终端中按预期运行。但是,当我将其作为 systemd 服务运行时,cmd.Output() 没有输出。
我的程序作为服务运行,但调用 cmd.Output() 返回错误。
我已经尝试让这个尽可能容易重现:
我在/home/myusername/Projects/test 有一个名为 test 的可执行 go 二进制文件
二进制文件是使用 go build 从包含以下代码的单个 main.go 文件构建的:
package main
import (
"fmt"
"log"
"log/syslog"
"os/exec"
)
func main() {
logwriter, e := syslog.New(syslog.LOG_NOTICE, "testprog")
if e == nil {
log.SetOutput(logwriter)
}
cmd := exec.Command("xdpyinfo")
out, err := cmd.Output()
if err != nil {
log.Print(fmt.Errorf("ERROR: %v", err))
}
log.Print(string(out))
}
日志记录仅用于测试目的,因为实际代码是更大应用程序的一部分。
当我在终端中运行测试二进制文件时,我在日志中看到来自xdpyinfo 的预期输出。
但是,当尝试在服务中运行相同的二进制文件时,它会输出 ERROR: exit status 1。
我运行该服务的步骤:
- 在
/etc/systemd/system/TestProg.service创建一个单元服务文件:
[Unit]
Description=Test service
ConditionPathExists=/home/myusername/Projects/test/test
After=network.target
[Service]
Type=simple
Restart=on-failure
RestartSec=10
startLimitIntervalSec=60
WorkingDirectory=/home/myusername/Projects/test
ExecStart=/home/myusername/Projects/test/test
[Install]
WantedBy=multi-user.target
- 启用服务:
sudo systemctl enable TestProg.service
- 启动服务:
sudo systemctl start TestProg.service
我还尝试在/lib/systemd/system/TestProg.service 找到单元服务文件,并在Type=simple 下添加User=username。
我尝试了几种不同的配置来尝试使其正常工作。我也尝试过使用SysProcAttr(带有实际的uid和gid)设置用户:
cmd := exec.Command("xdpyinfo")
cmd.SysProcAttr = &syscall.SysProcAttr{
Credential: &syscall.Credential{
Uid: uint32(uid),
Gid: uint32(gid),
NoSetGroups: true,
},
}
out, err := cmd.Output()
if err != nil {
log.Print(fmt.Errorf("ERROR: %v", err))
}
我现在开始认为我错过了一些更基本的东西。
【问题讨论】:
-
尝试 cmd,错误:= exec.Command("xdpyinfo").Output()。看不到任何明显的问题。