Search code examples
gosystemdsystemctlgopath

Systemd doesn't detect GOPATH (run without binary file)


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...)


Solution

  • 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.)