我开始使用supervisord来控制服务器中的服务。 我不是Linux的专业用户,但可以很好地得到它并运行。
出于好奇,我已经注意到,supervisord中的大多数命令似乎被称为:
[program:install] command=bash -c "/src/etc/install.sh"
我读过bash的man,并且知道-c应该用来插入在string之后传递的variables。
那么在主pipe(或任何其他地方)使用bash -c什么意义,而不是直接调用脚本(如下面的例子),考虑到没有通过/使用的variables?
[program:install] command=/src/etc/install.sh
谢谢!
命令列表( * ,?),命令列表( ; , && , || ),redirect( < , > , | )等shell特性不由supervisord实现,只将命令拆分为参数string数组。
bash -c可能只是帮助新手用户,他们可能会试图在命令中使用这些function。 比如它避免了这个惊喜
command=echo foo > /tmp/bar
输出foo > /tmp/bar而不是将foo写入/tmp/bar 。
-c与variables无关。 任何额外的bash参数只能作为脚本参数$0 , $1等在命令中使用,但是该function很less使用。 例如bash -c 'echo $0 $0' foo输出foo foo 。
这在文档中有解释:
当supervisord运行一个subprocess时,没有shell被执行,所以环境variables例如USER,PATH,HOME,SHELL,LOGNAME等不会从默认值改变或者被重新分配。 当你以超级用户身份运行一个程序作为超级用户在configuration中以user = stanza身份运行时,这一点尤其重要。
为了解决这个问题,可以使用bash -c 。