我有一个Upstart服务,应该启动多个工作器实例(使用rq作为作业队列)。但我无法将带有空格的命令传递给服务启动器。
我的Upstart配置(worker-manager.conf)如下所示:
description "my worker manager"
instance $id
start on runlevel [2345]
stop on runlevel [!2345]
respawn
script
logfile="/home/ubuntu/worker.log"
exec bash -c $cmd 2>$logfile
end script
因此,为了启动工作人员,这有效:
sudo service worker-manager start id=1 cmd="rqworker"
但这不是:
sudo service worker-manager start id=1 cmd="rqworker -v queue_1"
我得到的错误是:
start: Env must be KEY=VALUE pairs
我还没有运气使用双引号,单引号内双引号或转义空格。在配置文件中对参数进行硬编码确实有效。
我无法将命令作为多个参数传递,因为我事先并不知道应该侦听哪些队列或者有多少队列。 我现在的解决方法是将命令放在一个文件中,让服务管理器从那里读取它,但这很麻烦,我确信有更好的方法。此外,这一切都应该发生在由主人控制的一堆AWS“minion”实例上,因此限制了对我开放的解决方案的数量。 有什么想法吗?
答案 0 :(得分:1)
你可以尝试在sudo命令之前导出cmd变量。
它可能有效
export cmd="rqworker -v queue_1"
sudo -E service worker-manager start id=1
你需要仔细阅读man sudo,并注意-E标志。这可能有用
答案 1 :(得分:1)
直接使用start
命令
sudo start worker-manager id=1 cmd="rqworker -v queue_1"
虽然您可能需要再次引用:
sudo start worker-manager id=1 cmd="'rqworker -v queue_1'"