Передача команды с пробелом экземпляру службы 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, контролируемых мастером, что ограничивает количество доступных мне решений. Любые идеи?


person Stereoscopic    schedule 14.08.2015    source источник


Ответы (2)


используйте команду start напрямую

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

хотя вам, возможно, придется снова процитировать:

sudo start worker-manager id=1 cmd="'rqworker -v queue_1'"
person meuh    schedule 14.08.2015
comment
Потрясающе, большое спасибо! Как вы и подозревали, мне пришлось заключить переменную $cmd в кавычки в строке exec, то есть exec bash -c "$cmd" 2>$logfile, но после этого все работает! - person Stereoscopic; 14.08.2015

Вы можете попробовать экспортировать переменную cmd перед командой sudo.

Это может сработать

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

Вам нужно внимательно прочитать man sudo и обратить внимание на флаг -E. Это может сработать

person Grv    schedule 14.08.2015