【发布时间】: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