我有一个用 Golang 编写的 Web 服务,需要使用 Upstart 来启动。
我可以从其目录中手动在端口 5555 上运行服务可执行文件(名为 word),如下所示:
PORT=5555 ./word
然后curl -i http://127.0.0.1:5555/api/word
返回正确的响应(一些 JSON)。
现在,我需要通过 Upstart 运行此服务。我编写了这个脚本(称为 word.conf):
start on runlevel [2345]
stop on runlevel [!2345]
chdir /home/word
setgid word
setuid word
export PORT=5555
exec ./word
我通过运行它sudo start word
status word
然后告诉我服务正在运行,并且我在 Upstart 错误日志中没有看到任何错误。
当我尝试再次通过该服务访问时curl -i http://127.0.0.1:5555/api/word
出现curl: (7) couldn't connect to host
错误。
这看起来像是某种权限问题,但我无法确定。
我尝试删除setgid
和setuid
并运行,但没有成功。我确实有一个名为的用户word
。
我在使用 Ubuntu 12.04.3。
有任何想法吗?
答案1
如果这就是您的完整脚本,那么它有两个简单的问题。exec
应该是script [...] end script
这样的:
script
exec ./word
end script
并且应首先用以下env
节声明导出变量:
env PORT=5555
export PORT
所以整个脚本应该是这样的:
start on runlevel [2345]
stop on runlevel [!2345]
chdir /home/word
setgid word
setuid word
env PORT=5555
export PORT
script
exec ./word
end script
我还会./word
先调用解释器,而不是直接调用。如果是 bash 脚本:
exec /usr/bin/env bash ./word
Python:
exec /usr/bin/env python word
参考:
答案2
您需要使用 env 定义您的环境变量,并指定调用脚本的解释器:
start on runlevel [2345]
stop on runlevel [!2345]
chdir /home/word
setgid word
setuid word
env PORT=5555
export PORT
exec go run word
如果这是唯一使用它的进程,则可能不需要“导出 PORT”,并且如果解释器在脚本中定义,则甚至不需要将其包括在 exec 中。