为什么通过 Upstart 启动时无法连接到该服务?

为什么通过 Upstart 启动时无法连接到该服务?

我有一个用 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错误。

这看起来像是某种权限问题,但我无法确定。

我尝试删除setgidsetuid并运行,但没有成功。我确实有一个名为的用户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 中。

相关内容