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

Passing a command with whitespace to an Upstart service instance

我有一个 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

因此,要启动 worker,可以这样做:

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

你可以尝试在 sudo 命令之前导出 cmd 变量。

可能有用

export cmd="rqworker -v queue_1"
sudo -E service worker-manager start id=1

你需要仔细阅读 man sudo ,并注意 -E 标志。这可能有效

直接使用start命令

sudo start worker-manager id=1 cmd="rqworker -v queue_1"

尽管您可能需要再次引用:

sudo start worker-manager id=1 cmd="'rqworker -v queue_1'"