graceful_shutdown 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/graceful_shutdown.rb +64 -0
  3. metadata +59 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8088de0ff9f291434ebffe3a11f66bb3017ac896
4
+ data.tar.gz: 018035600bc16b2c3674596d53ab0c61d32e30b7
5
+ SHA512:
6
+ metadata.gz: f044965d5bbbea0cbfdadcbc88f3354dc607a65041e71bef9294749426ce19d23ef116d1d013436f9435e393afd98b3c4470886f54472d0cc38c46e15c6c73ac
7
+ data.tar.gz: 1ae42428f8e80cd517083ece8369923ecde8a4c1830c1b4f2ef71dc21c71d65a5f50775b88fc66c89aa4e9c82bdc303346533069ef34fed36d78302a8de11e22
@@ -0,0 +1,64 @@
1
+ # Catches +INT+ and +TERM+ and allows the task/program to finish execution
2
+ # before handling the interrupt safely.
3
+ #
4
+ # Usage:
5
+ # WithGracefulShutdown do
6
+ # begin
7
+ # loop do
8
+ # print '.'
9
+ # sleep 0.5
10
+ # end
11
+ # rescue Shutdown => shutdown
12
+ # puts "\ngoodbye"
13
+ # shutdown.continue
14
+ # end
15
+ # end
16
+
17
+ def WithGracefulShutdown(*signals, &block)
18
+ GracefulShutdown.new.handle_signals(*signals, &block)
19
+ end
20
+
21
+ class Shutdown < RuntimeError
22
+ def continue
23
+ raise self
24
+ end
25
+
26
+ def ignore
27
+ # No-Op, provided for clarity.
28
+ end
29
+ end
30
+
31
+ class GracefulShutdown
32
+ DEFAULT_SIGNALS = ['INT', 'TERM']
33
+ HANDLER = proc { raise Shutdown }
34
+
35
+ # Execute a block of code with signal handlers.
36
+ def handle_signals(*signals)
37
+ signals = DEFAULT_SIGNALS if signals.empty?
38
+
39
+ handlers = setup(signals)
40
+ yield if block_given?
41
+ teardown(handlers)
42
+ rescue Shutdown
43
+ teardown(handlers)
44
+ exit
45
+ end
46
+
47
+ private
48
+
49
+ # Setup signal traps, keeping track of the original handlers.
50
+ # NOTE If something else below this sets a trap, these traps will not
51
+ # be invoked.
52
+ def setup(signals)
53
+ signals.each_with_object({}) do |signal, handlers|
54
+ handlers[signal] = trap(signal, HANDLER)
55
+ end
56
+ end
57
+
58
+ # Restore original signal handlers.
59
+ def teardown(handlers)
60
+ handlers.each do |signal, handler|
61
+ trap(signal, handler)
62
+ end
63
+ end
64
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: graceful_shutdown
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Tim Uruski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ description: You can use GracefulShutdown to catch signals and safely shutdown your
28
+ program.
29
+ email: nerd@timuruski.net
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/graceful_shutdown.rb
35
+ homepage: https://rubygemgem.org/graceful_shutdown
36
+ licenses:
37
+ - MIT
38
+ metadata: {}
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 2.2.2
56
+ signing_key:
57
+ specification_version: 4
58
+ summary: A tiny helper for handling signals.
59
+ test_files: []