Class: SidekiqGracefulShutdown::Sidekiq

Inherits:
Object
  • Object
show all
Defined in:
lib/sidekiq_graceful_shutdown/sidekiq.rb

Class Method Summary collapse

Class Method Details

.find_processes_by_hostname(hostname) ⇒ Object



43
44
45
# File 'lib/sidekiq_graceful_shutdown/sidekiq.rb', line 43

def find_processes_by_hostname(hostname)
  ::Sidekiq::ProcessSet.new.to_a.select { |p| p['hostname'] == hostname }
end

.prepare_shutdownObject



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/sidekiq_graceful_shutdown/sidekiq.rb', line 27

def prepare_shutdown
  interval_sec = 5.seconds
  hostname     = Socket.gethostname

  quit_processes_by_hostname(hostname)

  loop do
    processes = find_processes_by_hostname(hostname)
    if processes.all? { |process| process['quiet'] == 'true' && process['busy'] == 0 }
      break
    end

    sleep interval_sec
  end
end

.quit_processes_by_hostname(hostname) ⇒ Object



47
48
49
50
51
52
53
54
55
# File 'lib/sidekiq_graceful_shutdown/sidekiq.rb', line 47

def quit_processes_by_hostname(hostname)
  find_processes_by_hostname(hostname).each do |process|
    puts "stopping process: pid:#{process['pid']}"
    begin
      Process.kill('TSTP', process['pid'])
    rescue Errno::ESRCH
    end
  end
end

.shutdownObject



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/sidekiq_graceful_shutdown/sidekiq.rb', line 4

def shutdown
  interval_sec = 5.seconds
  hostname     = Socket.gethostname

  quit_processes_by_hostname(hostname)

  loop do
    processes = find_processes_by_hostname(hostname)
    if processes.all? { |process| process['quiet'] == 'true' && process['busy'] == 0 }
      processes.each do |process|
        begin
          Process.kill('TERM', process['pid'])
        rescue Errno::ESRCH
        end
      end

      break
    end

    sleep interval_sec
  end
end