Monit以串行方式启动/重新启动进程

时间:2014-09-09 11:09:00

标签: ubuntu parallel-processing monit

我正在使用monit来启动一堆工作人员来运行qless,这是一个我们用于后台工作的排队系统。我的设置在/etc/monit/conf.d中有20个这样的文件:

check process qless-1 with pidfile /srv/app/shared/tmp/pids/qless-1.pid
  start program = "/bin/bash -c 'cd /srv/app/current && RAILS_ENV=prod2 BUNDLE_GEMFILE=/srv/app/current/Gemfile QUEUES=jobs /usr/local/rbenv/shims/bundle exec rake -f /srv/app/current/Rakefile qless:work_with_pidfile[/srv/app/shared/tmp/pids/qless-1.pid] >> /srv/app/shared/log/qless-1.log 2>&1'"
  stop  program = "/bin/bash -c '/bin/kill `/bin/cat /srv/app/shared/tmp/pids/qless-1.pid`'"

每个文件都引用自己的pid文件。启动环境并运行应用程序大约需要一分钟,我们经常需要重新启动它们。问题是monit似乎总是以串行方式启动/重启。这意味着所有工作人员上线需要大约20分钟,并且重启所有工作的时间相似。是不是所有关于并行运行的东西?我无法相信这是正确的行为,所以我可能做错了什么?谢谢!

2 个答案:

答案 0 :(得分:0)

您应该在异步调用中转换启动脚本,并将其发送到后台。然后使用with timeout指示monit在启动时不对您的服务进行轮询: 您也应该考虑使用服务组,因此您可以停止所有进程:

check process qless-1 with pidfile /srv/app/shared/tmp/pids/qless-1.pid
  start program = "call_to_async_script"  with timeout 60 seconds
  stop  program = "/bin/bash -c '/bin/kill `/bin/cat /srv/app/shared/tmp/pids/qless-1.pid`'"
  GROUP qless

然后,您可以立即启动和停止所有服务:

monit stop qless

答案 1 :(得分:0)

我遇到了同样的问题,我相信我已经明白了。

在继续启动其他进程之前,monit会等待pid文件出现。由于bundle exec和rails加载缓慢,rake任务需要花费大量时间来实际写出pid文件。

修复是将rake任务放在后台,立即从启动脚本中写出pidfile并分离:

start program = "/bin/bash -c 'cd /srv/app/current && RAILS_ENV=prod2 BUNDLE_GEMFILE=/srv/app/current/Gemfile QUEUES=jobs /usr/local/rbenv/shims/bundle exec rake -f /srv/app/current/Rakefile qless:work >> /srv/app/shared/log/qless-1.log 2>&1 & echo $! > /srv/app/shared/tmp/pids/qless-1.pid; detach'"