将带有空格的命令传递给Upstart服务实例

时间:2015-08-14 09:38:50

标签: ubuntu upstart

我有一个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”实例上,因此限制了对我开放的解决方案的数量。 有什么想法吗?

2 个答案:

答案 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'"