Systemd没有检测到GOPATH(没有二进制文件运行)

Ден*_*аль 1 go systemd systemctl gopath

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

[Unit]
Description=Goserver

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

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

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

$ sudo systemctl status goserver.service
Run Code Online (Sandbox Code Playgroud)

我收到错误:

??? 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)
Run Code Online (Sandbox Code Playgroud)

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

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

$ ls $GOPATH
goserver.log  index.go  pkg  src  templates
Run Code Online (Sandbox Code Playgroud)

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

$ /usr/bin/go run /home/denis/goserver/index.go
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用systemd服务它不起作用.

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

nos*_*nos 6

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

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

[Service]
Environment=GOPATH=/home/denis/goserver/
ExecStart=/usr/bin/go run /home/denis/goserver/index.go
Run Code Online (Sandbox Code Playgroud)

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


icz*_*cza 5

您创建的服务很可能与不同的用户(很可能root是默认用户)一起运行,其中可能没有GOPATHenv变量集(或者可能指向不同的文件夹).

你不应该go run用来运行用go编写的服务.首先使用go build或将它们编译为可执行二进制文件go install(更多内容:构建构建的内容是什么?),然后启动可执行二进制文件ExecStart.然后,您将不会依赖于GOPATH所安装的依赖项和依赖项(因为构建/安装只有在它们存在时才会成功).

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