为什么主管找不到命令源

cjd*_*jds 8 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
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操作(包括)在顶层可用.


Jia*_*Dai 6

我也遇到这个问题。

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

使用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