2017-03-02 61 views
1

我寫了簡單的systemd服務文件goserver.serviceSystemd沒有檢測GOPATH(無二進制文件運行)

[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服務? (不通過命令go build...創建的二進制文件)

回答

3

systemd服務運行在一個乾淨的環境中,所以它不會被啓動服務時用戶碰巧遇到的任何隨機環境所破壞。

所以你需要設置GOPATH在你的服務文件

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

這是一個非常不尋常的設置雖然,你在其它地方建立自己的應用程序,並有服務點,以現有的二進制和唐」不要讓服務編譯和運行你的代碼,因爲它可能會帶來所有潛在的問題(當前代碼不會編譯,服務器意外暴露其源代碼的機會增加等)。

5

您創建的服務將使用不同的用戶最有可能的運行(很可能是root是默認值),其中有可能不GOPATH環境變量集(或可能指向不同的文件夾)。

您不應該使用go run來運行用go編寫的服務。首先將它們編譯爲go buildgo install(詳情請見:What does go build build?),然後在ExecStart中啓動可執行二進制文件。然後你不會依賴諸如GOPATH和正在安裝的依賴關係(因爲構建/安裝只有在它們確實存在時才能成功)。

如果您真的想要使用go run,請確保GOPATH爲您的服務啓動的用戶設置;並且該用戶具有GOPATH文件夾的適當權限(因爲它位於用戶主文件夾內)。另請注意,您可以在[Service]部分指定User=Group=指令,以便您可以控制用戶啓動了哪些服務。

相關問題