在Ubuntu的sidekiq没有停止与暴发户

我完全按照Wiki中的规定安装了sidekiq的新贵服务。

这就是说,我有一个暴发户脚本,创build一个过程:

# 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不等于已知的upstart的PID。

 » 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] 

该configuration适用于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过程,认为它是工作( sidekiq ),但是底层的sidekiq继续存在:

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

我究竟做错了什么?

听起来像sidekiq deamonising或至less分叉。 所以你需要遵循http://upstart.ubuntu.com/cookbook/#expect ,或者find一个以非守护模式运行的sidekiq选项,或者添加一个合适的expect语句。

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

sidekiq既不妖魔化也不分叉(除非明确指定-d选项)。但是在我的exec脚本中,我调用了其他进程,这个暴发户试图算作我的一般过程。

expectselect在这里没有帮助,因为实际的sidekiq过程是,例如在连锁店的第六位。 更糟糕的是:指定expect fork会导致停止服务的暴发性挂断,而expect daemon会启动它。 参考这个答案如何打sidekiq挂断。

我终于坚持的解决scheme:需要定义一个暴发户脚本的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 

以上将尽力正常closuressidekiq并杀死它。 不是最优雅的解决scheme,但它的工作原理。