graceful_shutdown 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []