gpt4 book ai didi

ubuntu - exec.Command() 的 Golang cmd.Output() 在 systemd 服务(ubuntu)中引发错误

转载 作者:行者123 更新时间:2023-12-01 21:13:07 29 4
gpt4 key购买 nike

我有一个使用 cmd := exec.Command("xdpyinfo") 获取显示信息的 go 二进制文件然后调用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 找到单元服务文件。并添加 User=usernameType=simple 下.

    我尝试了几种不同的配置来尝试使其正常工作。我还尝试使用 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))
    }

    我现在开始认为我错过了一些更基本的东西。

    最佳答案

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

    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 "".

    关于ubuntu - exec.Command() 的 Golang cmd.Output() 在 systemd 服务(ubuntu)中引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62400623/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com