Systemd не обнаруживает 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: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, он не работает.

Как я могу запустить службу systemd с обнаруженным $GOPATH? (без бинарного файла, созданного командой go build...)


person Денис Смаль    schedule 02.03.2017    source источник


Ответы (2)


Служба systemd работает в чистой среде, поэтому она не затирается какой-либо случайной средой, в которой пользователь находится при запуске службы.

Поэтому вам нужно установить GOPATH в файле службы.

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

Однако это очень необычная установка, вы обычно создаете свое приложение в другом месте, и служба указывает на существующий двоичный файл, и служба не компилирует и не запускает ваш код со всеми потенциальными проблемами, которые могут возникнуть (текущий код не компиляция, повышенная вероятность того, что сервер случайно выставит исходный код и т. д.)

person nos    schedule 02.03.2017
comment
Теперь я использую xdg-open в своем скрипте golang. Он содержит: exec.Command("/bin/sh", "-c", "xdg-open path/to/my/pdf.pdf") Если я использую go run goserver/script.go, он работает нормально. Но если я использую служебный файл systemctl, я получаю сообщение об ошибке: правило просмотра для типа application/pdf не прошло свой тестовый пример. Какую среду я должен использовать в этом случае? - person Денис Смаль; 31.05.2018

Созданная вами служба, скорее всего, будет работать с другим пользователем (скорее всего, root по умолчанию), для которого может не быть установлена ​​переменная GOPATH env (или может указывать на другую папку).

Вы не должны использовать go run для запуска сервисов, написанных на go. Сначала скомпилируйте их в исполняемые двоичные файлы с помощью go build или go install (подробнее об этом: Что делает сборка сборки?) и запустите исполняемый двоичный файл в ExecStart. Тогда вы не будете полагаться на такие вещи, как GOPATH и устанавливаемые зависимости (поскольку сборка/установка будет успешной, только если они существуют).

Если вы действительно хотите использовать go run, убедитесь, что GOPATH установлен для пользователя, с которым запущена ваша служба; а также что у пользователя есть соответствующие разрешения для папки GOPATH (поскольку она находится внутри домашней папки пользователя). Также обратите внимание, что вы можете указать директивы User= и Group= в разделе [Service], чтобы вы могли контролировать, с каким пользователем запускается ваша служба.

person icza    schedule 02.03.2017