【问题标题】:Systemd doesn't detect GOPATH (run without binary file)Systemd 未检测到 GOPATH(在没有二进制文件的情况下运行)
【发布时间】:2017-07-21 23:15:50
【问题描述】:

我写了简单的 systemd 服务文件goserver.service:

[Unit]
Description=Goserver

[Service]
ExecStart=/usr/bin/go run /home/denis/goserver/index.go

[Install]
WantedBy=multi-user.target

但是当我尝试运行服务并获取状态时:

$ sudo systemctl status goserver.service

我得到错误:

мар 02 12:28:04 DV go[13627]: home/denis/goserver/index.go:6:2: cannot find package "gopkg.in/mgo.v2" in any of:
мар 02 12:28:04 DV go[13627]:         /usr/lib/go-1.6/src/gopkg.in/mgo.v2 (from $GOROOT)
мар 02 12:28:04 DV go[13627]:         ($GOPATH not set)

但是$GOPATH 是用export 命令设置的:

$ export GOPATH="/home/denis/goserver/"

$ ls $GOPATH
goserver.log  index.go  pkg  src  templates

命令行中的这个命令可以正常工作:

$ /usr/bin/go run /home/denis/goserver/index.go

但如果我使用 systemd 服务,它就不起作用了。

如何使用检测到的$GOPATH 运行 systemd 服务? (没有由命令go build...创建的二进制文件)

【问题讨论】:

    标签: go systemd systemctl gopath


    【解决方案1】:

    您创建的服务很可能会与不同的用户一起运行(很可能root 是默认用户),其中可能没有设置GOPATH env 变量(或可能指向不同的文件夹)。

    您不应该使用go run 来运行用 go 编写的服务。首先使用go buildgo install(更多信息:What does go build build?)将它们编译为可执行二进制文件,然后在ExecStart 中启动可执行二进制文件。然后你就不会依赖像 GOPATH 和正在安装的依赖项之类的东西(因为只有在它们确实存在时构建/安装才会成功)。

    如果您真的想使用go run,请确保为启动您的服务的用户设置了GOPATH;并且用户对GOPATH 文件夹具有适当的权限(因为它位于用户主文件夹中)。另请注意,您可以在[Service] 部分中指定User=Group= 指令,这样您就可以控制由哪个用户启动您的服务。

    【讨论】:

      【解决方案2】:

      systemd 服务在干净的环境中运行,因此它不会被用户在启动服务时碰巧所处的任何随机环境所破坏。

      所以你需要在你的服务文件中设置GOPATH

      [Service]
      Environment=GOPATH=/home/denis/goserver/
      ExecStart=/usr/bin/go run /home/denis/goserver/index.go
      

      不过,这是一个非常不寻常的设置,您通常在其他地方构建应用程序,并让服务指向现有的二进制文件,并且不会让服务编译和运行您的代码,而这可能会带来所有潜在的问题(当前代码无法编译,服务器意外暴露其源代码的机会增加等)

      【讨论】:

      • 现在我在我的 golang 脚本中使用 xdg-open。它包含:exec.Command("/bin/sh", "-c", "xdg-open path/to/my/pdf.pdf") 如果我使用 go run goserver/script.go 它工作正常。但是如果我使用 systemctl 服务文件,我会得到错误:“application/pdf”类型的“view”规则没有通过它的测试用例。在这种情况下我应该使用什么环境?
      猜你喜欢
      • 2010-09-14
      • 2023-04-07
      • 2018-06-11
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多