Module: DistribCore::ReceivedSignals

Defined in:
lib/distrib_core/received_signals.rb

Overview

A handler for signal interruptions (like INT and TERM). Stores information about received signals.

Class Method Summary collapse

Class Method Details

.any?TrueClass, FalseClass

Returns ‘true` when received any signal.

Returns:

  • (TrueClass, FalseClass)

    ‘true` when received any signal



27
28
29
# File 'lib/distrib_core/received_signals.rb', line 27

def any?
  signals.any?
end

.exit_codeInteger

Returns proper exit code based on received signal.

Returns:

  • (Integer)

    proper exit code based on received signal



48
49
50
51
52
# File 'lib/distrib_core/received_signals.rb', line 48

def exit_code
  return 0 if signals.empty?

  Signal.list[signals.first]
end

.force_int?TrueClass, FalseClass

Returns ‘true` if ’INT’ was sent twice.

Returns:

  • (TrueClass, FalseClass)

    ‘true` if ’INT’ was sent twice



38
39
40
# File 'lib/distrib_core/received_signals.rb', line 38

def force_int?
  @force_int
end

.messageString

Returns human-readable message about received signals.

Returns:

  • (String)

    human-readable message about received signals



43
44
45
# File 'lib/distrib_core/received_signals.rb', line 43

def message
  "RECEIVED SIGNAL #{signals.to_a.join(', ')}." if any?
end

.received?(sig) ⇒ TrueClass, FalseClass

Returns ‘true` if signal `sig` was recieved.

Parameters:

  • sig (String)

Returns:

  • (TrueClass, FalseClass)

    ‘true` if signal `sig` was recieved



33
34
35
# File 'lib/distrib_core/received_signals.rb', line 33

def received?(sig)
  signals.member?(sig)
end

.signalsSet<String>

Returns list of received signals.

Returns:

  • (Set<String>)

    list of received signals



55
56
57
# File 'lib/distrib_core/received_signals.rb', line 55

def signals
  @signals ||= Set.new
end

.trap(sig) ⇒ Object

Defines trap for singlas and collects them. Exits after second ‘INT’

Examples:

::DistribCore::ReceivedSignals.trap('INT')

Parameters:

  • sig (String)

    signal to trap



13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/distrib_core/received_signals.rb', line 13

def trap(sig)
  Signal.trap(sig) do
    # Second SIGINT finishes the process immediately
    if sig == 'INT' && signals.member?('INT')
      @force_int = true
      puts 'Received second SIGINT. Exiting...'
      Kernel.exit(2) # 2 is exit code for SIGINT
    end
    puts "Received #{sig}"
    signals.add(sig)
  end
end