Я установил выскочку для sidekiq точно так же, как указано в его вики.
Тем не менее, у меня есть сценарий выскочки, который создает процесс с:
# skipped other insstructions
script
exec /bin/bash <<'EOT'
source /home/me/.my_env
cd /home/me
exec bin/sidekiq -e production
EOT
end script
Сервис запускается отлично, но, как видно, PID sidekiq не равен PID, который известен upstart
.
» initctl status sidekiq
# sidekiq start/running, process 16020
» ps axww|grep sidekiq
# 16181 ? Sl 0:41 sidekiq 3.0.0 me[0 of 3 busy]
Эта конфигурация работает для любого другого сценария выскочки, за исключением sidekiq:
» sudo initctl stop sidekiq
# sidekiq stop/waiting
» ps axww|grep sidekiq
# 16181 ? Sl 0:45 sidekiq 3.0.0 me[0 of 3 busy]
Кажется, что initctl
убивает процесс bash, который он рассматривает как задание (16020), но лежащий в основе sidekiq
продолжает жить:
» ps axww|grep '16181\|16020'
# 16181 ? Sl 0:45 sidekiq 3.0.0 me[0 of 3 busy]
Что я делаю не так?
Похоже, sidekiq деамонизирует или, по крайней мере, разветвляется. Итак, вам нужно следовать http://upstart.ubuntu.com/cookbook/#expect, либо найдите параметр sidekiq, который работает в режиме без демона, либо добавьте соответствующий оператор ожидания.
Благодарим @douglas-leeder за то, что он указал мне правильное направление.
sidekiq
не демонизирует и не разветвляется (если только -d
(опция явно указана.) Но внутри моего сценария exec я вызвал другие процессы, и этот выскочка пытался посчитать моим общим процессом.
expect
вариант здесь не помогает, поскольку фактический процесс sidekiq был, скажем, 6-м в цепочке. Еще хуже: уточнение expect fork
приводит к зависанию выскочки при остановке службы, в то время как expect daemon
зависает при запуске. Обратитесь к этому ответ о том, как бороться с зависанием sidekiq.
Решение, к которому я наконец пришел: нужно определить post-stop
раздел сценария выскочки, содержащий что-то вроде:
post-stop script
# ps-grep your PIDS
# for sidekiq:
SQ_PIDS=`ps -Ao pid,command | grep sidekiq | grep -v grep | awk '{ print $1 }' | sed 'N;s/\n/ /g'`
sudo kill -USR1 $SQ_PIDS
sleep 3
sudo kill -9 $SQ_PIDS
sudo rm sidekiq.pid 2>&1 >/dev/null
end script
Вышеупомянутое попытается изящно закрыть sidekiq и в конце концов убить его. Не самое элегантное решение, но оно работает.