为什么主管找不到命令源

时间:2017-03-28 17:42:44

标签: bash supervisord

以下是我的supervisor.conf

[supervisord]
nodaemon=true

[program:daphne]
command=source "/opt/ros/indigo/setup.sh" && daphne -b 0.0.0.0 -p 8000 robot_configuration_interface.asgi:channel_layer

[program:worker]
environment=DJANGO_SETTINGS_MODULE="robot_configuration_interface.settings"
command= source "/opt/ros/indigo/setup.bash" && django-admin runworker

这是我得到的错误:

  

INFO spawnerr:找不到命令'source'

bash不应该有命令源。如果这是使用sh,我如何强制它运行bash?

3 个答案:

答案 0 :(得分:11)

Supervisor根本不会启动shell,bash sh - 所以毫无疑问它找不到shell-builtin命令。如果你需要一个,你必须自己开始一个。因此:

command=/bin/bash -c 'source "$0" && exec "$@"' /opt/ros/indigo/setup.sh daphne -b 0.0.0.0 -p 8000 robot_configuration_interface.asgi:channel_layer

command=/bin/bash -c 'source "$0" && exec "$@"' /opt/ros/indigo/setup.bash django-admin runworker

在这两种情况下,都存在exec来告诉shell在内存中替换它正在执行的进程,而不是留下一个只做等待该进程退出的shell实例。

bash -c之后的第一个参数放在$0中,之后的第一个参数放在$1之后;因此,我们可以提取"$0"并执行"$@"来引用第一个这样的参数,然后再引用它们。

来自the docs

  

当运行子进程时,supervisord不会执行shell,因此USER,PATH,HOME,SHELL,LOGNAME等环境变量不会更改其默认值或以其他方式重新分配。< / p>

因此,shell操作(包括&&)同样不能在顶层使用。

答案 1 :(得分:1)

我也遇到了这个问题。

我找到了更好的解决方案。

使用source ~/.bash_profile可能更好。

[program: dapi]
user=pyer
command=/bin/bash -c 'source ~/.bash_profile  && /usr/local/python3.6/bin/pipenv run python manage.py'
directory=/data/prd/tools/dapi
autostart=true
startretries=1
stopasgroup=true

如果由主管创建的进程创建了子进程,也许可以参考: http://supervisord.org/subprocess.html#pidproxy-program

答案 2 :(得分:0)

尝试通过简单的命令验证Nodejs是否安装成功:

node -v

如果没有,安装它,就是这样。 在基于 Debian 的发行版中安装它:

sudo apt install nodejs