Module: Gitlab::ProcessManagement

Defined in:
lib/gitlab/process_management.rb

Class Method Summary collapse

Class Method Details

.all_alive?(pids) ⇒ Boolean

Returns true if all the processes are alive.

Returns:

  • (Boolean)


44
45
46
47
48
49
50
# File 'lib/gitlab/process_management.rb', line 44

def self.all_alive?(pids)
  pids.each do |pid|
    return false unless process_alive?(pid)
  end

  true
end

.any_alive?(pids) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/gitlab/process_management.rb', line 52

def self.any_alive?(pids)
  pids_alive(pids).any?
end

.modify_signals(signals, command) ⇒ Object

Traps the given signals with the given command.

Example:

modify_signals(%i(HUP TERM), 'DEFAULT')


28
29
30
# File 'lib/gitlab/process_management.rb', line 28

def self.modify_signals(signals, command)
  signals.each { |signal| trap(signal, command) }
end

.pids_alive(pids) ⇒ Object



56
57
58
# File 'lib/gitlab/process_management.rb', line 56

def self.pids_alive(pids)
  pids.select { |pid| process_alive?(pid) }
end

.process_alive?(pid) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
63
64
65
66
# File 'lib/gitlab/process_management.rb', line 60

def self.process_alive?(pid)
  return false if pid.nil?

  # Signal 0 tests whether the process exists and we have access to send signals
  # but is otherwise a noop (doesn't actually send a signal to the process)
  signal(pid, 0)
end

.process_died?(pid) ⇒ Boolean

Returns:

  • (Boolean)


68
69
70
# File 'lib/gitlab/process_management.rb', line 68

def self.process_died?(pid)
  !process_alive?(pid)
end

.signal(pid, signal) ⇒ Object



32
33
34
35
36
37
# File 'lib/gitlab/process_management.rb', line 32

def self.signal(pid, signal)
  Process.kill(signal, pid)
  true
rescue Errno::ESRCH
  false
end

.signal_processes(pids, signal) ⇒ Object



39
40
41
# File 'lib/gitlab/process_management.rb', line 39

def self.signal_processes(pids, signal)
  pids.each { |pid| signal(pid, signal) }
end

.trap_signals(signals) ⇒ Object

Traps the given signals and yields the block whenever these signals are received.

The block is passed the name of the signal.

Example:

trap_signals(%i(HUP TERM)) do |signal|
  ...
end


15
16
17
18
19
20
21
# File 'lib/gitlab/process_management.rb', line 15

def self.trap_signals(signals)
  signals.each do |signal|
    trap(signal) do
      yield signal
    end
  end
end

.write_pid(path) ⇒ Object



72
73
74
75
76
# File 'lib/gitlab/process_management.rb', line 72

def self.write_pid(path)
  File.open(path, 'w') do |handle|
    handle.write(Process.pid.to_s)
  end
end