以下是我的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
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
INFO spawnerr:无法找到命令'source'
bash不应该有命令源.如果这是使用sh我怎么能强制它运行bash?
Cha*_*ffy 14
管理员根本不会启动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
Run Code Online (Sandbox Code Playgroud)
和
command=/bin/bash -c 'source "$0" && exec "$@"' /opt/ros/indigo/setup.bash django-admin runworker
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,exec都会出现告诉shell将内存替换为正在执行的进程,而不是留下一个只做等待该进程退出的shell实例.
bash -c放入$0后面的第一个参数,然后放入后面的参数$1; 因此,我们可以获取"$0"和执行"$@"以引用第一个这样的参数,然后引用它们.
来自文档:
当运行子进程时,supervisord不会执行shell,因此诸如USER,PATH,HOME,SHELL,LOGNAME等环境变量不会更改其默认值或以其他方式重新分配.
因此,&&类似地不能期望shell操作(包括)在顶层可用.
我也遇到这个问题。
我找到了更好的解决方案。
使用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
Run Code Online (Sandbox Code Playgroud)
如果supervisor启动的进程创建了子进程,可以参考:http : //supervisord.org/subprocess.html#pidproxy-program