【问题标题】:Trying to run service that access to X server under systemd尝试在 systemd 下运行访问 X 服务器的服务
【发布时间】:2018-07-29 12:58:45
【问题描述】:

我正在使用带有 systemd 的 manjaro linux(基于 arch)。我想创建一个在后台运行的守护程序服务,并以随机间隔截取屏幕截图,最多间隔 10 分钟。

我正在使用 Go,如果我构建并从命令行运行它,我有一个可以正常工作的程序(见下文)。我为该服务创建了一个 .service 文件(见下文),并使用systemctl start screenshot 启动它并确认它使用systemctl is-active screenshot 运行。但是,它不起作用。如果我从命令行运行它,则不会保存任何屏幕截图。

出于兴趣,我尝试使用 nohup ./screenshot & 运行它,但它遇到了与我的守护进程尝试相同的问题。

在后台使用 date 包有什么问题吗?或者可能是截图库?

screenshot.go

package main

import (
    "fmt"
    "image/png"
    "math/rand"
    "os"
    "time"

    "github.com/coreos/go-systemd/daemon"
    "github.com/vova616/screenshot"
)

func main() {
    daemon.SdNotify(false, "READY=1")
    i := 0
    for {
        r := rand.Intn(10)
        time.Sleep(time.Duration(r) * time.Minute)
        t := time.Now()
        year, month, day := t.Date()
        date := fmt.Sprintf("%d-%s-%d", year, month.String(), day)
        img, err := screenshot.CaptureScreen()
        if err != nil {
            fmt.Println(err)
            continue
        }
        hour, min, sec := t.Clock()
        stamp := fmt.Sprintf("%d:%d:%d", hour, min, sec)
        fmt.Printf("Taking screenshot %s\n", stamp)
        f, err := os.Create(fmt.Sprintf("/home/dave/screenshot/%s/%s.png", date, stamp))
        if err != nil {
            fmt.Println(err)
            continue
        }
        err = png.Encode(f, img)
        if err != nil {
            fmt.Println(err)
            continue
        }
        err = f.Close()
        if err != nil {
            fmt.Println(err)
            continue
        }
        i++
        daemon.SdNotify(false, "WATCHDOG=1")
    }
}

这里是服务文件

[Unit]
Description=Random Screenshot Service

[Service]
Type=notify
ExecStart=/home/dave/screenshot/screenshot
WatchdogSec=30s
Restart=on-failure

[Install]
WantedBy=multi-user.target

【问题讨论】:

  • 你的日志有错误吗?
  • 如果你需要一个服务来访问你的 X 服务器,你不能在 systemd 中运行它,你需要在 X 中运行它。最好的方法可能取决于哪个 DE /您正在使用的窗口管理器。但这可能最好在 Super User 上问,因为它实际上是关于如何在 X 中启动服务,而不是编程本身。

标签: linux go daemon systemd archlinux


【解决方案1】:

在 Flimzy 对我的问题发表评论之后,我明白了。正如他所说,您不能从 systemd 运行依赖于 X 的东西,所以我从我的 .i3/config 文件中自动运行它(我使用 I3 窗口管理器)。再次感谢 Flimzy 帮助我。

【讨论】:

    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 2014-02-23
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多