以下是我的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?
答案 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