Ubuntu上的sidekiq未能因新贵而停止


0

我完全按照wiki的规定为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

服务可以完美启动,但是正如人们可能会看到的那样,sidekiq的PID不等于已知的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]

我究竟做错了什么?

Answers:


1

听起来好像sidekiq令人着迷或至少是分叉。因此,您需要遵循http://upstart.ubuntu.com/cookbook/#expect,或者为在非守护程序模式下运行的sidekiq找到一个选项,或者添加一个适当的Expect语句。


好吧,感谢您为我指明了正确的方向。问题更加严重:我在script部分中使用了复杂的脚本,该脚本在执行期间创建了许多进程。新贵似乎放弃了这一点,因此我终于添加了一个post-stop部分,以优雅地关闭sidekiq。
Aleksei Matiushkin,2015年

0

感谢@ douglas-leeder向我指出正确的方向。

sidekiq既不是妖魔化也不是分叉自身(除非-d明确指定了选项。)但是在我的exec脚本中,我调用了其他进程,该新贵试图将其计为我的一般进程。

expect选项没有帮助,因为实际的sidekiq流程在链中排名第六。更糟糕的是:指定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并最终将其杀死。不是最优雅的解决方案,但它可以工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.