Systemd不';t检测GOPATH(无二进制文件运行)
我编写了简单的systemd服务文件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
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”规则没有通过它的测试用例。在这种情况下,我应该使用什么环境?