我完全按照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脚本中,我调用了其他进程,这个暴发户试图算作我的一般过程。
expect
select在这里没有帮助,因为实际的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,但它的工作原理。