重启Sidekiq

17

正确的 Sidekiq 重启方式是什么?它在启动时似乎会缓存工作程序代码,因此每次更改工作程序时都需要重新启动。我使用 Ctrl / C 进行此操作,但该过程需要很长时间才能关闭并返回到提示符。

有办法强制立即重启吗?

我正在使用最新版本的 Sinatra,并通过 POW 运行。

1个回答

17

Sidekiq带有sidekiqctl命令,它可以停止与您的Sidekiq进程相关联的PID。您需要传递PID文件以及等待所有线程完成的秒数。

示例用法:

sidekiqctl stop #{rails_root}/tmp/pids/sidekiq_website_crawler.pid 60

这里的60代表等待所有Sidekiq线程处理完毕的秒数。如果经过60秒后,还有未完成的线程,则它们会被自动终止。

我还建议使用God gem来监控、停止、启动和重启Sidekiq。

一旦这样做了,您可以使用bundle exec god stop来停止所有Sidekiq线程。

这是我作为示例的God文件:

rails_env = ENV['RAILS_ENV'] || "development"
rails_root = ENV['RAILS_ROOT'] || "/home/hwc218/BuzzSumo"
 God.watch do |w|
     w.dir      = "#{rails_root}"
     w.name     = "website_crawler"
     w.interval = 30.seconds
     w.env      = {"RAILS_ENV" => rails_env}
     w.interval = 30.seconds
     w.start = "bundle exec sidekiq -C #{rails_root}/config/sidekiq_website_crawler.yml"
     w.stop = "sidekiqctl stop #{rails_root}/tmp/pids/sidekiq_website_crawler.pid 60"
     w.keepalive


    # determine the state on startup
     w.transition(:init, { true => :up, false => :start }) do |on|
    on.condition(:process_running) do |c|
      c.running = true
    end
    end

     # determine when process has finished starting
      w.transition([:start, :restart], :up) do |on|
      on.condition(:process_running) do |c|
      c.running = true
      c.interval = 5.seconds
    end

      # failsafe
       on.condition(:tries) do |c|
      c.times = 5
      c.transition = :start
      c.interval = 5.seconds
     end
    end

    # start if process is not running
     w.transition(:up, :start) do |on|
    on.condition(:process_running) do |c|
      c.running = false
    end
    end

    w.restart_if do |restart|
        restart.condition(:restart_file_touched) do |c|
          c.interval = 5.seconds
          c.restart_file = File.join(rails_root, 'tmp', 'restart.txt')
        end
    end
 end

我的sidekiq.pid文件应该长什么样? - Undistraction
2
它应该只包含Sidekiq进程ID的PID(数字)。运行ps -ef | grep "sidekiq"来获取它。 - Henley
您能详细解释一下吗?我应该在什么时候运行它?我肯定需要每次启动Sidekiq时都运行它,然后将其添加到god.config中。 - Undistraction
当你运行sidekiq时,你需要传递一个yml文件,其中你需要指定PID FILE。这里有一个例子:https://github.com/mperham/sidekiq/blob/master/examples/config.yml。所以你需要运行bundle exec sidekiq -C <YML文件路径>。 - Henley
谢谢。我正在配置它,然后启动它,但需要同时完成两个步骤。 - Undistraction
为了澄清@HenleyChiu的回答,您可以使用ps -ef | grep sidekiq查找pid,然后创建一个文件(例如sidekiq.pid),其中唯一的内容是您刚刚找到的pid,然后使用sidekiqctl stop <your_pidfile>停止进程。 - eebbesen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接