Systemd不';t检测GOPATH(无二进制文件运行)

Systemd不';t检测GOPATH(无二进制文件运行),go,systemd,systemctl,gopath,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 但当我尝试运行服务并获取状态时: $ sudo systemctl status goserver.service 我得到一个错误: мар 02 12:28

我编写了简单的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服务?(如果没有由命令创建的二进制文件,请执行编译…)

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

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


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

您创建的服务最有可能与其他用户一起运行(最有可能的
root
是默认值),其中可能没有
GOPATH
env变量集(或可能指向其他文件夹)

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


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

systemd服务在干净的环境中运行,因此在启动服务时不会受到用户所处的任何随机环境的影响

因此,您需要在服务文件中设置GOPATH

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

但这是一种非常不寻常的设置,您通常在其他地方构建应用程序,并将服务点指向现有的二进制文件,而不让服务编译并运行代码,从而可能导致所有潜在问题(当前代码未编译,服务器意外暴露其源代码的可能性增加等)

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”规则没有通过它的测试用例。在这种情况下我应该使用什么环境?现在我在golang脚本中使用xdg open。它包含:
exec.Command(“/bin/sh”、“-c”、“xdg open path/to/my/pdf.pdf”)
如果我使用
go-run-goserver/script.go,它可以正常工作。但是如果我使用systemctl服务文件,我会得到一个错误:“application/pdf”类型的“view”规则没有通过它的测试用例。在这种情况下,我应该使用什么环境?