0

我正在尝试使用 resque 调度程序,但我找不到监控进程的好方法。我想要的是在任何部署后终止调度程序作业并upstart重新启动它。我写了一个 capistrano 脚本来杀死 resque-scheduler

    task :stop_scheduler => :environment do
      pidfile = Rails.root + "tmp/pids/resque_scheduler.pid"
      if File.exists?(pidfile)
        pid = File.read(pidfile).to_i
        syscmd = "kill -s QUIT #{pid}"
        puts "Running syscmd: #{syscmd}"
        system(syscmd)
        FileUtils.rm_f(pidfile)
      else
        puts "****WARNING**** Scheduler pid file has not been found. Was scheduler running??"
     end
   end

此时暴发户将重新启动它。我的问题可能与暴发户conf有关。我需要 Schduler 在 tmp/pids/resque_scheduler.pid 中写入 PID,以便能够在下次重新启动时将其杀死。

这是我的新贵 conf 重要部分:

respawn
respawn limit 99 5
console none

script
su -c "source 'cd /myapp/; RAILS_ENV={env} bundle exec rake resque:scheduler BACKGROUND=yes    PIDFILE=./tmp/pids/resque_scheduler.pid >> ~/resque_workers.log 2>&1" my_user
end script

使用这种配置,我的效果是调度程序再次分叉,而我在 pidfile 上写的 pid 不正确。我以一个不断重生的过程结束,我不能再杀了。

有什么建议吗?

4

2 回答 2

0

这是旧的,但你检查过: http: //upstart.ubuntu.com/cookbook/#expect

基本上,您需要告诉 upstart 分叉多少次 - 在您的情况下,我相信您会添加expect fork到您的 upstart 配置文件中,因为 su -c 将分叉一次(expect daemon如果您的脚本分叉两次,您将使用)。

于 2013-06-19T00:28:08.853 回答
0

我有同样的问题,我发现我必须删除 Background=yes 标志。

我通过查看我的叉数来确定这一点,叉数超过 2 并且还在不断增长。有关如何执行此操作的信息,请参阅http://upstart.ubuntu.com/cookbook/#how-to-establish-fork-count 。

我删除了 Background=yes 作为测试并且它有效。我认为这是因为 upstart 会自动在后台启动任务,不仅不需要指示它在后台运行,而且会导致 upstart 感到困惑并不断产生新进程。

一旦我删除了 BACKGROUND=yes,上面提到的“如何建立分叉计数”的结果是 2,这意味着它是一个守护进程,因此你需要在你的 upstart 脚本中使用它:

期待守护进程

于 2015-11-03T19:17:30.007 回答