dongzaobei0942
dongzaobei0942
2017-03-02 09:46
浏览 253
已采纳

Systemd无法检测到GOPATH(在没有二进制文件的情况下运行)

I wrote simple systemd service-file goserver.service:

[Unit]
Description=Goserver

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

[Install]
WantedBy=multi-user.target

But when I try to run service and get status:

$ sudo systemctl status goserver.service

I get error:

мар 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)

But $GOPATH is set with export command:

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

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

And this command from command-line works fine:

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

But if I use systemd service it doesn't work.

How can I run systemd service with detected $GOPATH? (without binary file created by command go build...)

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • douningle7944
    douningle7944 2017-03-02 10:21
    已采纳

    A systemd service runs with a clean environment, so it is not clobbered by any random environment the user happens to be in when starting a service.

    So you need to set the GOPATH in your service file

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

    This is a very unusual setup though, you normally build your application elsewhere, and have the service point to an existing binary, and don't have the service compile and run your code with all the potential problems that could entail (current code does not compile, increased chance of server accidentally exposes its source code etc.)

    点赞 评论
  • douxuan1284
    douxuan1284 2017-03-02 09:50

    The service you created will most likely run with a different user (most likely root is the default), of whom there might not be GOPATH env variable set (or may point to a different folder).

    You shouldn't use go run to run services written in go. First compile them to executable binaries either with go build or go install (more on this: What does go build build?), and start the executable binary in ExecStart. Then you won't rely on things like GOPATH and dependencies being installed (because building/installing will only succeed if they do exist).

    If you truly want to use go run, make sure GOPATH is set for the user your service is started with; and also that the user has proper permissions for the GOPATH folder (as it's inside a user home folder). Also note that you can specify the User= and Group= directives in the [Service] section, so you can control with what user your service is started.

    点赞 评论

相关推荐