daemonizer 0.0.4 → 0.0.6
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.
- data/README +5 -9
- data/VERSION +1 -1
- data/daemonizer.gemspec +3 -2
- data/lib/daemonizer/autoload.rb +2 -0
- data/lib/daemonizer/cli.rb +5 -2
- data/lib/daemonizer/config.rb +40 -10
- data/lib/daemonizer/daemonize.rb +5 -1
- data/lib/daemonizer/dsl.rb +9 -0
- data/lib/daemonizer/engine.rb +22 -9
- data/lib/daemonizer/handler.rb +43 -0
- metadata +5 -4
data/README
CHANGED
@@ -34,15 +34,11 @@ pool :daemonizer do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
pool :new_daemonizer do
|
37
|
+
workers 4
|
38
|
+
poll_period 5
|
39
|
+
log_file "log/daemonizer.log" #relative to Demfile
|
37
40
|
|
38
|
-
|
39
|
-
logger.info "New: Preparing master process"
|
40
|
-
block.call
|
41
|
-
end
|
41
|
+
handler ::AsyncObserver::DaemonizerHandler
|
42
42
|
|
43
|
-
|
44
|
-
logger.info "Started #{worker_id}/#{workers_count}"
|
45
|
-
sleep 1
|
46
|
-
logger.info "Stopped #{worker_id}/#{workers_count}"
|
47
|
-
end
|
43
|
+
set_option :queue, lambda { |worker_id, worker_count| "queue_#{worker_id}"}
|
48
44
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.6
|
data/daemonizer.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{daemonizer}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Gleb Pomykalov"]
|
12
|
-
s.date = %q{2010-07-
|
12
|
+
s.date = %q{2010-07-08}
|
13
13
|
s.default_executable = %q{daemonizer}
|
14
14
|
s.description = %q{Inspired by bundler and rack. Mostly built on top of Alexey Kovyrin's loops code. http://github.com/kovyrin/loops}
|
15
15
|
s.email = %q{glebpom@gmail.com}
|
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
|
|
31
31
|
"lib/daemonizer/dsl.rb",
|
32
32
|
"lib/daemonizer/engine.rb",
|
33
33
|
"lib/daemonizer/errors.rb",
|
34
|
+
"lib/daemonizer/handler.rb",
|
34
35
|
"lib/daemonizer/process_manager.rb",
|
35
36
|
"lib/daemonizer/worker.rb",
|
36
37
|
"lib/daemonizer/worker_pool.rb"
|
data/lib/daemonizer/autoload.rb
CHANGED
data/lib/daemonizer/cli.rb
CHANGED
@@ -66,12 +66,14 @@ module Daemonizer
|
|
66
66
|
end
|
67
67
|
|
68
68
|
desc "restart", "Restart pool"
|
69
|
+
method_option :demfile, :type => :string, :aliases => "-D", :banner => "Path to Demfile"
|
69
70
|
def restart(pool_name = nil)
|
70
71
|
invoke :stop, pool_name
|
71
72
|
invoke :start, pool_name
|
72
73
|
end
|
73
74
|
|
74
75
|
desc "debug", "Debug pool (do not demonize)"
|
76
|
+
method_option :demfile, :type => :string, :aliases => "-D", :banner => "Path to Demfile"
|
75
77
|
def debug(pool_name = nil)
|
76
78
|
puts "You should supply pool_name to debug" if pool_name.nil?
|
77
79
|
control_pools_loop(pool_name, "execution ended", options[:demfile]) do |pool|
|
@@ -84,7 +86,8 @@ module Daemonizer
|
|
84
86
|
print_pool pool.name, " Done!"
|
85
87
|
exit(0)
|
86
88
|
end
|
87
|
-
return true
|
89
|
+
return true
|
90
|
+
end
|
88
91
|
|
89
92
|
private
|
90
93
|
def control_pools_loop(pool_name, message = nil, demfile = nil, &block)
|
@@ -110,7 +113,7 @@ module Daemonizer
|
|
110
113
|
if pool = pools[pool_name.to_sym]
|
111
114
|
[pool]
|
112
115
|
else
|
113
|
-
print_pool pool_name, "
|
116
|
+
print_pool pool_name, "pool is not configured"
|
114
117
|
[]
|
115
118
|
end
|
116
119
|
else
|
data/lib/daemonizer/config.rb
CHANGED
@@ -2,7 +2,7 @@ module Daemonizer
|
|
2
2
|
class Config
|
3
3
|
class ConfigError < StandardError; end
|
4
4
|
|
5
|
-
attr_reader :pool
|
5
|
+
attr_reader :pool, :handler
|
6
6
|
|
7
7
|
def initialize(pool, options)
|
8
8
|
@pool = pool
|
@@ -10,6 +10,17 @@ module Daemonizer
|
|
10
10
|
init_defaults
|
11
11
|
init_logger
|
12
12
|
validate
|
13
|
+
initialize_handler
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize_handler
|
17
|
+
if @options[:after_init]
|
18
|
+
@handler = FakeHandler.new(@options[:before_init], @options[:after_init], @options)
|
19
|
+
@options[:after_init] = @options[:before_init] = nil
|
20
|
+
elsif
|
21
|
+
@handler = @options[:handler].new(@options[:handler_options])
|
22
|
+
end
|
23
|
+
@handler.logger = @logger
|
13
24
|
end
|
14
25
|
|
15
26
|
def init_logger
|
@@ -22,30 +33,49 @@ module Daemonizer
|
|
22
33
|
end
|
23
34
|
|
24
35
|
def init_defaults
|
25
|
-
@options[:before_init] ||=
|
36
|
+
@options[:before_init] ||= nil
|
37
|
+
@options[:after_init] ||= nil
|
26
38
|
@options[:engine] ||= :fork
|
27
39
|
@options[:workers] ||= 1
|
28
40
|
@options[:log_file] ||= "log/#{@pool}.log"
|
29
41
|
@options[:poll_period] ||= 5
|
30
42
|
@options[:pid_file] ||= "pid/#{@pool}.pid"
|
43
|
+
@options[:handler] ||= nil
|
44
|
+
@options[:handler_options] ||= {}
|
31
45
|
end
|
32
46
|
|
33
47
|
def validate
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
48
|
+
raise ConfigError, "Workers count should be more then zero" if @options[:workers] < 1
|
49
|
+
raise ConfigError, "Engine #{@options[:engine]} is not known" unless [:fork, :thread].include?(@options[:engine])
|
50
|
+
|
51
|
+
raise ConfigError, "Poll period should be more then zero" if @options[:poll_period] < 1
|
52
|
+
if @options[:handler]
|
53
|
+
raise ConfigError, "Handler should be a class" unless @options[:handler].is_a?(Class)
|
54
|
+
raise ConfigError, "Handler should respond to :after_init" unless @options[:handler].public_instance_methods.include?('after_init')
|
55
|
+
raise ConfigError, "Handler set. Don't use :after_init and :before init in Demfile" if @options[:before_init] || @options[:after_init]
|
56
|
+
else
|
57
|
+
raise ConfigError, "set_option can be used only with handler" if @options[:handler_options].any?
|
58
|
+
if @options[:before_init]
|
59
|
+
raise ConfigError, "before_init should have block" unless @options[:before_init].is_a?(Proc)
|
60
|
+
end
|
61
|
+
raise ConfigError, "after_init should be set" if @options[:after_init].nil?
|
62
|
+
raise ConfigError, "after_init should have block" unless @options[:after_init].is_a?(Proc)
|
38
63
|
end
|
39
|
-
Daemonizer.report_fatal_error "after_init should be set", @logger if @options[:after_init].nil?
|
40
|
-
Daemonizer.report_fatal_error "after_init should have block", @logger unless @options[:after_init].is_a?(Proc)
|
41
|
-
Daemonizer.report_fatal_error "Poll period should be more then zero", @logger if @options[:poll_period] < 1
|
42
64
|
end
|
43
65
|
|
44
|
-
[:
|
66
|
+
[:engine, :workers, :poll_period, :root].each do |method|
|
45
67
|
define_method method do
|
46
68
|
@options[method.to_sym]
|
47
69
|
end
|
48
70
|
end
|
71
|
+
|
72
|
+
def before_init
|
73
|
+
@handler.method(:before_init)
|
74
|
+
end
|
75
|
+
|
76
|
+
def after_init
|
77
|
+
@handler.method(:after_init)
|
78
|
+
end
|
49
79
|
|
50
80
|
[:log_file, :pid_file].each do |method|
|
51
81
|
define_method method do
|
data/lib/daemonizer/daemonize.rb
CHANGED
@@ -48,9 +48,13 @@ module Daemonizer
|
|
48
48
|
|
49
49
|
fork && exit # Fork and exit from the parent
|
50
50
|
|
51
|
+
STDIN.reopen '/dev/null'
|
52
|
+
STDOUT.reopen '/dev/null', 'a'
|
53
|
+
STDERR.reopen STDOUT
|
54
|
+
|
51
55
|
# Detach from the controlling terminal
|
52
56
|
unless sess_id = Process.setsid
|
53
|
-
raise
|
57
|
+
raise 'cannot detach from controlling terminal'
|
54
58
|
end
|
55
59
|
|
56
60
|
# Prevent the possibility of acquiring a controlling terminal
|
data/lib/daemonizer/dsl.rb
CHANGED
@@ -14,6 +14,15 @@ module Daemonizer
|
|
14
14
|
@pool = :default
|
15
15
|
@configs = {}
|
16
16
|
end
|
17
|
+
|
18
|
+
def set_option(option, value)
|
19
|
+
@options[:handler_options] ||= {}
|
20
|
+
@options[:handler_options][option.to_sym] = value
|
21
|
+
end
|
22
|
+
|
23
|
+
def handler(handler)
|
24
|
+
@options[:handler] = handler
|
25
|
+
end
|
17
26
|
|
18
27
|
def poll_period(seconds)
|
19
28
|
@options[:poll_period] = seconds.to_i
|
data/lib/daemonizer/engine.rb
CHANGED
@@ -16,17 +16,20 @@ module Daemonizer
|
|
16
16
|
init_block = Proc.new do
|
17
17
|
begin
|
18
18
|
@pm.start_workers do |process_id|
|
19
|
-
@config.
|
19
|
+
@config.handler.worker_id = process_id
|
20
|
+
@config.handler.workers_count = @config.workers
|
21
|
+
@config.handler.after_init
|
20
22
|
end
|
21
23
|
rescue Exception => e
|
22
|
-
|
24
|
+
log_error(e)
|
23
25
|
end
|
24
26
|
end
|
25
27
|
|
26
28
|
begin
|
27
|
-
@config.
|
29
|
+
@config.handler.logger = logger
|
30
|
+
@config.handler.before_init(init_block)
|
28
31
|
rescue Exception => e
|
29
|
-
|
32
|
+
log_error(e)
|
30
33
|
end
|
31
34
|
# Start monitoring loop
|
32
35
|
|
@@ -35,22 +38,32 @@ module Daemonizer
|
|
35
38
|
end
|
36
39
|
|
37
40
|
def debug!
|
38
|
-
|
41
|
+
outputter = Outputter.stdout
|
42
|
+
outputter.formatter = PatternFormatter.new :pattern => "%d - %l %g - %m"
|
43
|
+
logger.outputters = outputter
|
39
44
|
|
40
45
|
init_block = Proc.new do
|
41
46
|
begin
|
42
|
-
@config.
|
47
|
+
@config.handler.worker_id = 1
|
48
|
+
@config.handler.workers_count = 1
|
49
|
+
@config.handler.after_init
|
43
50
|
rescue Exception => e
|
44
|
-
|
51
|
+
log_error(e)
|
45
52
|
end
|
46
53
|
end
|
47
54
|
|
48
55
|
begin
|
49
|
-
@config.
|
56
|
+
@config.handler.logger = logger
|
57
|
+
@config.handler.before_init(init_block)
|
50
58
|
rescue Exception => e
|
51
|
-
|
59
|
+
log_error(e)
|
52
60
|
end
|
53
61
|
end
|
62
|
+
|
63
|
+
def log_error(e)
|
64
|
+
logger.fatal e.to_s
|
65
|
+
logger.fatal "#{e.class}: #{e}\n" + e.backtrace.join("\n")
|
66
|
+
end
|
54
67
|
|
55
68
|
private
|
56
69
|
def setup_signals
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Daemonizer
|
2
|
+
class Handler
|
3
|
+
attr_accessor :worker_id
|
4
|
+
attr_accessor :workers_count
|
5
|
+
attr_accessor :logger
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
@options = options
|
9
|
+
end
|
10
|
+
|
11
|
+
def before_init(block)
|
12
|
+
block.call
|
13
|
+
end
|
14
|
+
|
15
|
+
def option(key)
|
16
|
+
if option = @options[key.to_sym] and option.is_a?(Proc)
|
17
|
+
option.call(@worker_id, @workers_count)
|
18
|
+
else
|
19
|
+
option
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class FakeHandler < Handler
|
25
|
+
def initialize(before_init, after_init, options = {})
|
26
|
+
@before_init = before_init
|
27
|
+
@after_init = after_init
|
28
|
+
super(options)
|
29
|
+
end
|
30
|
+
|
31
|
+
def before_init(block)
|
32
|
+
if @before_init
|
33
|
+
@before_init.call(@logger, block)
|
34
|
+
else
|
35
|
+
super
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def after_init
|
40
|
+
@after_init.call(@logger, @worker_id, @workers_count)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: daemonizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Gleb Pomykalov
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-07-
|
18
|
+
date: 2010-07-08 00:00:00 +04:00
|
19
19
|
default_executable: daemonizer
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -72,6 +72,7 @@ files:
|
|
72
72
|
- lib/daemonizer/dsl.rb
|
73
73
|
- lib/daemonizer/engine.rb
|
74
74
|
- lib/daemonizer/errors.rb
|
75
|
+
- lib/daemonizer/handler.rb
|
75
76
|
- lib/daemonizer/process_manager.rb
|
76
77
|
- lib/daemonizer/worker.rb
|
77
78
|
- lib/daemonizer/worker_pool.rb
|