使用supervisord运行Golang程序时无法识别GOPATH

使用supervisord运行Golang程序时无法识别GOPATH,go,supervisord,Go,Supervisord,我有一个Golang程序实现了一个web服务器。预计它将持续运行,并在出现任何意外故障或崩溃时重新启动自身。为此,我尝试使用supervisords将其配置为UNIX进程。但是,我面临的问题是,代码中包含的外部go库没有被识别为supervisorORD无法识别GOPATH。这会导致以下错误: web_server.go:11:2: cannot find package "github.com/gorilla/mux" in any of: /usr/lib/go/src/github

我有一个Golang程序实现了一个web服务器。预计它将持续运行,并在出现任何意外故障或崩溃时重新启动自身。为此,我尝试使用
supervisords
将其配置为UNIX进程。但是,我面临的问题是,代码中包含的外部go库没有被识别为
supervisorORD
无法识别
GOPATH
。这会导致以下错误:

web_server.go:11:2: cannot find package "github.com/gorilla/mux" in any of:
    /usr/lib/go/src/github.com/gorilla/mux (from $GOROOT)
    ($GOPATH not set)
使用supervisord运行web服务器时。我的web服务器的supervisord配置为:

[program:web_server]
command=go run web_server.go
directory=/home/ubuntu
autostart=true
autorestart=true
startretries=5
stderr_logfile=/home/ubuntu/err_logs/web_server.err.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10

解决方法是什么?

如前所述,
supervisord
的一个重要特性是:

子进程将继承用于启动的shell的环境
supervisord
程序。几个环境变量将由 在孩子的环境中监督自己,包括
SUPERVISOR\u已启用
(指示流程处于SUPERVISOR状态的标志 控制),
SUPERVISOR\u PROCESS\u NAME
(流程指定的配置文件 此流程的名称)和
主管\u组\u名称
配置文件(为子进程指定了进程组名称)

这些环境变量可以在[supervisord]中重写 名为
环境的节配置选项(适用于所有子流程)
或者在per-
[program:x]
节环境配置选项中 (仅适用于
[程序:x]
第节)

因此,在
环境
变量中添加
GOPATH
解决了这个问题

[program:web_server]
command=go run web_server.go
directory=/home/ubuntu
autostart=true
autorestart=true
startretries=5
stderr_logfile=/home/ubuntu/err_logs/web_server.err.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
environment=GOPATH="/home/ubuntu"

如前所述,
supervisord
的一个重要属性是:

子进程将继承用于启动的shell的环境
supervisord
程序。几个环境变量将由 在孩子的环境中监督自己,包括
SUPERVISOR\u已启用
(指示流程处于SUPERVISOR状态的标志 控制),
SUPERVISOR\u PROCESS\u NAME
(流程指定的配置文件 此流程的名称)和
主管\u组\u名称
配置文件(为子进程指定了进程组名称)

这些环境变量可以在[supervisord]中重写 名为
环境的节配置选项(适用于所有子流程)
或者在per-
[program:x]
节环境配置选项中 (仅适用于
[程序:x]
第节)

因此,在
环境
变量中添加
GOPATH
解决了这个问题

[program:web_server]
command=go run web_server.go
directory=/home/ubuntu
autostart=true
autorestart=true
startretries=5
stderr_logfile=/home/ubuntu/err_logs/web_server.err.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
environment=GOPATH="/home/ubuntu"

你不应该使用
go run
。使用
go build
构建一个静态二进制文件,然后通过supervisord运行它。您的程序不会在每次重新启动时重新编译(这就是“go run”所做的),也不需要每次都提供其依赖项。Go程序被设计成独立的二进制文件。哦,是的。我错过了。非常感谢。如何运行go-build和运行二进制文件?您不应该使用
go-run
。使用
go build
构建一个静态二进制文件,然后通过supervisord运行它。您的程序不会在每次重新启动时重新编译(这就是“go run”所做的),也不需要每次都提供其依赖项。Go程序被设计成独立的二进制文件。哦,是的。我错过了。非常感谢。如何运行go构建和运行二进制文件?