如何为supervisord设置PATH以找到可执行文件

9 投票
3 回答
8554 浏览
提问于 2025-04-17 00:20

我正在尝试设置 supervisor.conf。我的一个应用需要用到 node.js,但系统中并没有安装 node。此外,因为它需要绑定到 80 端口,所以必须以 root 用户身份运行。我该如何修改 PATH 变量,以便 supervisord 能找到 node 可执行文件(这个文件在一个特定的目录中)并运行 node.js 应用呢?


我想这样做:

[supervisord]
environment=PATH=/path/to/where/node/executable/is

[program:web]
command=node web.js -c config.json

但是这样做失败了,错误信息是:

2011-08-25 16:49:29,494 INFO spawnerr: can't find command 'node'

3 个回答

5

我最近开始使用的一种模式是通过一个脚本来启动我正在运行的程序,这样可以设置环境变量等等,这个方法和zenbeni的有点相似。

比如:

#!/bin/sh
export EXAMPLE_VARIABLE=something
export PYTHONPATH=/something
export PATH=$PATH:/somewhere/else
exec python somescript.py

这里的'exec'很重要。它的作用是用正在执行的程序替换掉/bin/sh,而不是像子进程那样去启动它。这意味着不会有额外的进程存在,同时信号也能正常工作。

这种方法相比zenbeni的方式有一个(小)优势,就是在更新环境变量时,只需要重启supervisor,也就是说不需要重新读取或更新等操作。如果你碰到我遇到的同样的bug(需要完全重启supervisor来更新事件监听器的环境变量),这个优势会变得更明显。

12

你可以在命令中使用env来添加它:

[program:web]
command=env PATH="/path/to/where/node/executable/is" node web.js -c config.json

不过在某些情况下,环境变量似乎不起作用。

-1

你可以直接设置命令的绝对路径:

[program:web]
command=/path/to/where/node/executable/is/node web.js -c config.json

撰写回答