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

Я установил новомодный сервис для sidekiq точно, как указано в, он - Wiki.

Тем не менее у меня есть новомодный сценарий, который создает процесс с:

# 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 уничтожает процесс удара, который это рассматривает как задание (16020), но базовый sidekiq продолжает жить:

» ps axww|grep  '16181\|16020'
# 16181 ?        Sl     0:45 sidekiq 3.0.0 me[0 of 3 busy]

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

0
задан 26 August 2015 в 09:48
2 ответа

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

0
ответ дан 4 December 2019 в 16:50

Похоже, sidekiq деамонизирует или, по крайней мере, разветвляется. Поэтому вам нужно следовать http://upstart.ubuntu.com/cookbook/#expect , либо найти параметр sidekiq, который работает в режиме без демона, либо добавить соответствующий оператор ожидания.

1
ответ дан 4 December 2019 в 16:50

Теги

Похожие вопросы