【问题标题】:Golang cmd.Output() of exec.Command() throws error in systemd service (ubuntu)exec.Command() 的 Golang cmd.Output() 在 systemd 服务(ubuntu)中抛出错误
【发布时间】: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

我运行该服务的步骤:

  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
  1. 启用服务:

sudo systemctl enable TestProg.service

  1. 启动服务:

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()。看不到任何明显的问题。

标签: ubuntu go systemd


【解决方案1】:

您必须在您的用户会话中运行它(这也启动了您的 X11 会话):

systemd-run --user -t  xdpyinfo |head
Running as unit: run-u1614.service
Press ^] three times within 1s to disconnect TTY.
name of display:    :0
version number:    11.0
vendor string:    The X.Org Foundation

你在没有golang的情况下考试:

sudo systemd-run -t  xdpyinfo 
Running as unit: run-u2876.service
Press ^] three times within 1s to disconnect TTY.
/usr/bin/xdpyinfo:  unable to open display "".

【讨论】:

    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多