Sidekiq на Ubuntu не удалось остановить с выскочкой

Я установил сервис upstart для 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]

Эта конфигурация работает для любого другого сценария upstart, за исключением 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]

Что я делаю неправильно?

2 ответа

Решение

Кредиты @ Douglas-Leeder за то, что они указали мне правильное направление.

sidekiq не демонизирует и не разветвляется (если не -d опция явно указана.) Но внутри моего exec-скрипта я вызывал другие процессы, которые выскочки пытались посчитать моим общим процессом.

expect Опция здесь не помогает, так как фактический процесс sidekiq был, скажем, 6-м в цепочке. Еще хуже: уточнение expect fork приводит к зависанию upstart при остановке службы, в то время как expect daemon обнимает его при запуске. Обратитесь к этому ответу о том, как бороться с Sidekiq Hangup.

Решение, которое я, наконец, придерживался: нужно определить post-stop раздел сценария upstart, содержащий что-то вроде:

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 и убить его в конце концов. Не самое элегантное решение, но оно работает.

Похоже, Sidekiq деамонизирует или, по крайней мере, разветвляет. Так что вам нужно следовать http://upstart.ubuntu.com/cookbook/, либо найти опцию sidekiq, которая работает в не-демоническом режиме, либо добавить соответствующий оператор ожидаемого.

Другие вопросы по тегам