我正在使用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分钟,并且重启所有工作的时间相似。是不是所有关于并行运行的东西?我无法相信这是正确的行为,所以我可能做错了什么?谢谢!
答案 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'"