Ubuntu 以串行方式监视启动/重新启动进程

Ubuntu 以串行方式监视启动/重新启动进程,ubuntu,parallel-processing,monit,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

我正在使用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分钟的时间才能上线,而重启所有工作也需要同样的时间。monit不都是并行运行吗?我不敢相信这是正确的行为,那么我做错了什么疯狂的事呢?谢谢

您应该在异步调用中转换启动脚本,并将其发送到后台。然后使用指示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

我也有同样的问题,我相信我已经解决了

发生的情况是,monit等待pid文件出现,然后再继续启动其他进程。由于
bundle exec
和rails加载速度缓慢,rake任务需要花费大量时间才能真正写出pidfile

修复方法是将rake任务放在后台,立即从start脚本中写出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'"