daemonic 0.0.1 → 0.0.2

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c90af55fdad70a6c4a99fc782c9fa34fb7ed6939
4
+ data.tar.gz: 08b9b435ce0d8e4c5b87978b66f804a55b388dab
5
+ SHA512:
6
+ metadata.gz: d6a23fc8d43c33e1346dce80900130ea7c703d80b05e6028cbb8cb7d0c8c44315f3aad50d1a20f17bcc849412b77376db282582e6b9a2fb16c4d38cfdf1fc444
7
+ data.tar.gz: e38c14642dc4d6c5b618610b62bfd30e3b315571dff5cf2cbf36ff7e040be1b3735522c85c6e8f841c20ca0986485ddc4a90ebd6a043d69592d93a6654120f74
data/README.md CHANGED
@@ -87,6 +87,33 @@ These are the signals daemonic responds to:
87
87
  * `TTIN` increase the number of workers by one
88
88
  * `TTOU` decrease the number of workers by one
89
89
 
90
+ ### Creating a worker
91
+
92
+ Here's an example of a basic daemonic worker:
93
+
94
+ ``` ruby
95
+ exiting = false
96
+
97
+ trap("TERM") { exiting = true }
98
+ trap("INT") { exiting = true }
99
+ trap("HUP") {
100
+ # reload settings
101
+ }
102
+
103
+ puts "Booting worker number #{ENV["DAEMON_WORKER_NUMBER"]}"
104
+
105
+ SomePollingService.poll do
106
+ # do your work here
107
+ break if exiting
108
+ end
109
+
110
+ puts "Shutting down worker number #{ENV["DAEMON_WORKER_NUMBER"]}"
111
+ ```
112
+
113
+ Most importantly:
114
+
115
+ * Trap INT and TERM signals to cleanly stop your process
116
+
90
117
  ## Contributing
91
118
 
92
119
  1. Fork it
data/bin/daemonic CHANGED
@@ -2,13 +2,5 @@
2
2
  $LOAD_PATH.unshift(File.expand_path("../../lib", __FILE__))
3
3
 
4
4
  require 'daemonic'
5
-
6
- config = Daemonic.configuration(ARGV, Dir.pwd)
7
-
8
- config.reload
9
-
10
- if config.daemonize?
11
- Process.daemon
12
- end
13
-
14
- Daemonic.spawn(config)
5
+ options = Daemonic::CLI.parse(ARGV)
6
+ Daemonic.start(options)
@@ -6,10 +6,10 @@ module Daemonic
6
6
 
7
7
  Invalid = Class.new(ArgumentError)
8
8
 
9
- attr_reader :eventual_config, :args
9
+ attr_reader :eventual_config, :given_options
10
10
 
11
- def initialize(args, pwd)
12
- @args = args
11
+ def initialize(given_options, pwd)
12
+ @given_options = given_options
13
13
  @pwd = pwd
14
14
  @eventual_config = {}
15
15
  end
@@ -34,9 +34,9 @@ module Daemonic
34
34
  @eventual_config = {}
35
35
  @logger = nil
36
36
  load_options defaults
37
- load_options command_line_options
37
+ load_options given_options
38
38
  load_options config_file_options if config_file
39
- load_options command_line_options
39
+ load_options given_options
40
40
  logger.debug { to_h.inspect }
41
41
  validate
42
42
  end
@@ -92,10 +92,6 @@ module Daemonic
92
92
  end
93
93
  end
94
94
 
95
- def command_line_options
96
- CLI.parse(args)
97
- end
98
-
99
95
  def config_file_options
100
96
  contents = File.open(config_file, 'r:utf-8').read
101
97
  args = Shellwords.split(contents)
@@ -76,12 +76,12 @@ module Daemonic
76
76
  end
77
77
 
78
78
  def trap_signals
79
- trap("USR2") { info "USR2 received!"; restart }
80
- trap("TERM") { info "TERM received!"; stop }
81
- trap("INT") { info "INT received!"; stop }
82
- trap("HUP") { info "HUP received!"; hup }
83
- trap("TTIN") { info "TTIN received!"; ttin }
84
- trap("TTOU") { info "TTOU received!"; ttou }
79
+ trap("USR2") { Thread.new { info "USR2 received!"; restart } }
80
+ trap("TERM") { Thread.new { info "TERM received!"; stop } }
81
+ trap("INT") { Thread.new { info "INT received!"; stop } }
82
+ trap("HUP") { Thread.new { info "HUP received!"; hup } }
83
+ trap("TTIN") { Thread.new { info "TTIN received!"; ttin } }
84
+ trap("TTOU") { Thread.new { info "TTOU received!"; ttou } }
85
85
  end
86
86
 
87
87
  def ttin
@@ -1,3 +1,3 @@
1
1
  module Daemonic
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/daemonic.rb CHANGED
@@ -6,12 +6,12 @@ require "daemonic/cli"
6
6
 
7
7
  module Daemonic
8
8
 
9
- def self.spawn(*args)
10
- Master.new(*args).start
9
+ def self.start(options)
10
+ config = Configuration.new(options, Dir.pwd)
11
+ config.reload
12
+ Process.daemon if config.daemonize?
13
+ Master.new(config).start
11
14
  end
12
15
 
13
- def self.configuration(*args)
14
- Configuration.new(*args)
15
- end
16
16
 
17
17
  end
@@ -19,6 +19,23 @@ class TestIntegration < MiniTest::Unit::TestCase
19
19
  wait_for(10) { not running? master_pid }
20
20
  end
21
21
 
22
+ def test_start_daemonic_programmatically
23
+ $LOAD_PATH.unshift(File.expand_path("../../lib", __FILE__))
24
+ require 'daemonic'
25
+ Thread.new {
26
+ Daemonic.start(
27
+ name: "daemon-test",
28
+ workers: 5,
29
+ command: "ruby test/test_daemon.rb",
30
+ logfile: LOGFILE,
31
+ pidfile: "tmp/test.pid",
32
+ )
33
+ }
34
+ sleep 0.2
35
+ master_pid = Integer(File.open("tmp/test.pid").read)
36
+ perform_tests(master_pid)
37
+ end
38
+
22
39
  def setup
23
40
  FileUtils.mkdir_p(File.dirname(LOGFILE))
24
41
  FileUtils.rm(LOGFILE) if File.exist?(LOGFILE)
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: daemonic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.0.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - iain
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-06-14 00:00:00.000000000 Z
11
+ date: 2014-01-07 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,17 +27,15 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  description: Manages daemonizing your workers with basic monitoring and restart behavior.
@@ -74,27 +69,26 @@ files:
74
69
  homepage: https://github.com/yourkarma/daemonic
75
70
  licenses:
76
71
  - MIT
72
+ metadata: {}
77
73
  post_install_message:
78
74
  rdoc_options: []
79
75
  require_paths:
80
76
  - lib
81
77
  required_ruby_version: !ruby/object:Gem::Requirement
82
- none: false
83
78
  requirements:
84
- - - ! '>='
79
+ - - '>='
85
80
  - !ruby/object:Gem::Version
86
81
  version: '0'
87
82
  required_rubygems_version: !ruby/object:Gem::Requirement
88
- none: false
89
83
  requirements:
90
- - - ! '>='
84
+ - - '>='
91
85
  - !ruby/object:Gem::Version
92
86
  version: '0'
93
87
  requirements: []
94
88
  rubyforge_project:
95
- rubygems_version: 1.8.23
89
+ rubygems_version: 2.1.0
96
90
  signing_key:
97
- specification_version: 3
91
+ specification_version: 4
98
92
  summary: Manages daemonizing your workers with basic monitoring and restart behavior.
99
93
  test_files:
100
94
  - test/config