light-daemon 0.9.7 → 0.9.8
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 +10 -13
- data/lib/light_daemon.rb +37 -39
- metadata +18 -40
data/README
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
|
1
|
+
Light-daemon is a ruby gem. It could help developers quickly build a daemon which preforks worker processes and monitors them.
|
2
|
+
|
2
3
|
The usage is very simple:
|
3
4
|
|
4
|
-
|
5
|
+
#------------------------------------------------------------------------------
|
5
6
|
require 'rubygems'
|
6
7
|
require 'light_daemon'
|
7
8
|
|
@@ -16,19 +17,17 @@ The usage is very simple:
|
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
19
|
-
LightDaemon::Daemon.start(Client.new, :children=> 2, :pid_file => "/tmp/light-daemon.pid"
|
20
|
-
|
20
|
+
LightDaemon::Daemon.start(Client.new, :children=> 2, :pid_file => "/tmp/light-daemon.pid")
|
21
|
+
#------------------------------------------------------------------------------
|
21
22
|
|
22
23
|
What you need to do is:
|
24
|
+
|
23
25
|
1. Create your worker class. Define a method "call" and put the real work into it.
|
24
26
|
2. The method "call" needs to return true for the daemon to continuously call it.
|
25
|
-
3. You need to tell the daemon how many worker processes you want and a filename for daemon to store
|
26
|
-
|
27
|
-
4. If the method "call" returns false, the daemon will kill this work process and create a new one.
|
28
|
-
This would be very helpful if your code might have memory leaking and you want it to restart after
|
29
|
-
certain criteria is met. An example is as following:
|
27
|
+
3. You need to tell the daemon how many worker processes you want and a filename for daemon to store the PID of the daemon process.
|
28
|
+
4. If the method "call" returns false, the daemon will kill this worker process and create a new one. This would be very helpful if your code might have memory leaking and you want it to restart after certain criteria is met. An example is as following:
|
30
29
|
|
31
|
-
|
30
|
+
#------------------------------------------------------------------------------
|
32
31
|
require 'rubygems'
|
33
32
|
require 'light_daemon'
|
34
33
|
|
@@ -46,12 +45,10 @@ What you need to do is:
|
|
46
45
|
end
|
47
46
|
|
48
47
|
LightDaemon::Daemon.start(Client.new, :children=> 2, :pid_file => "/tmp/light-daemon.pid" )
|
49
|
-
|
50
|
-
|
48
|
+
#------------------------------------------------------------------------------
|
51
49
|
|
52
50
|
|
53
51
|
|
54
52
|
Yi Zhang
|
55
53
|
yzhang[dot]wa[at]gmail[dot]com
|
56
54
|
3/11/2012
|
57
|
-
|
data/lib/light_daemon.rb
CHANGED
@@ -5,7 +5,7 @@ module LightDaemon
|
|
5
5
|
class << self
|
6
6
|
def start(obj, options={})
|
7
7
|
@options = self.make_options(options)
|
8
|
-
|
8
|
+
@pid_file = @options[:pid_file]
|
9
9
|
if self.get_pid
|
10
10
|
raise "The pid file \"#{@pid_file}\" existed already. You need to stop the daemon first."
|
11
11
|
end
|
@@ -15,21 +15,21 @@ module LightDaemon
|
|
15
15
|
def stop(pid_file=DEFAULT_PID_FILE)
|
16
16
|
@pid_file = pid_file
|
17
17
|
if(pid = self.get_pid)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
begin
|
19
|
+
Process.kill("TERM", pid)
|
20
|
+
rescue Errno::ESRCH
|
21
|
+
# no such process. do nothing
|
22
22
|
end
|
23
|
-
|
23
|
+
self.clear_pid
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
def get_pid
|
28
28
|
return nil unless File.exist?(@pid_file)
|
29
|
-
|
30
|
-
|
29
|
+
begin
|
30
|
+
File.open(@pid_file) {|f| f.read}.to_i
|
31
31
|
rescue
|
32
|
-
|
32
|
+
nil
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -45,7 +45,7 @@ module LightDaemon
|
|
45
45
|
options[:children] ||= 1
|
46
46
|
options[:monitor_cycle] ||= 10 # seconds
|
47
47
|
options[:pid_file] ||= DEFAULT_PID_FILE
|
48
|
-
|
48
|
+
options
|
49
49
|
end
|
50
50
|
|
51
51
|
# for debugging
|
@@ -74,19 +74,19 @@ module LightDaemon
|
|
74
74
|
@processes.each do |pid|
|
75
75
|
Process.kill("TERM", pid)
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
sleep(3)
|
79
79
|
options[:children].times do
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
80
|
+
@processes.size.times do
|
81
|
+
pid = @processes.shift
|
82
|
+
if process_alive?(pid)
|
83
|
+
@processes << pid
|
84
|
+
sleep(3)
|
85
85
|
end
|
86
|
-
|
86
|
+
end
|
87
87
|
end
|
88
|
-
|
89
|
-
|
88
|
+
@processes.each do |pid|
|
89
|
+
Process.kill(9, pid)
|
90
90
|
end
|
91
91
|
end
|
92
92
|
$keep_running = false
|
@@ -110,35 +110,29 @@ module LightDaemon
|
|
110
110
|
@options[:children].times do
|
111
111
|
if pid = fork
|
112
112
|
@processes << pid
|
113
|
-
|
113
|
+
Process.detach(pid)
|
114
114
|
else
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
end
|
119
|
-
return
|
120
|
-
end
|
115
|
+
run_child
|
116
|
+
return
|
117
|
+
end
|
121
118
|
end
|
122
119
|
|
123
120
|
while($keep_running)
|
124
121
|
sleep(@options[:monitor_cycle])
|
125
122
|
|
126
|
-
|
123
|
+
@processes.each_with_index do |pid, index|
|
127
124
|
unless process_alive?(pid)
|
128
125
|
if pid = fork
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
while($keep_running)
|
135
|
-
break unless @obj.send(:call)
|
136
|
-
end
|
126
|
+
@processes[index] = pid
|
127
|
+
Process.detach(pid)
|
128
|
+
sleep(2)
|
129
|
+
else
|
130
|
+
run_child
|
137
131
|
return
|
138
|
-
|
132
|
+
end
|
139
133
|
else
|
140
134
|
end
|
141
|
-
|
135
|
+
sleep(1)
|
142
136
|
end
|
143
137
|
end
|
144
138
|
self.class.clear_pid(@options[:pid_file])
|
@@ -148,7 +142,7 @@ module LightDaemon
|
|
148
142
|
def daemonize
|
149
143
|
fork && exit
|
150
144
|
unless Process.setsid
|
151
|
-
|
145
|
+
raise 'cannot detach from controlling terminal'
|
152
146
|
end
|
153
147
|
|
154
148
|
trap 'SIGHUP', 'IGNORE'
|
@@ -160,8 +154,12 @@ module LightDaemon
|
|
160
154
|
STDERR.sync = true
|
161
155
|
end
|
162
156
|
|
163
|
-
def
|
157
|
+
def run_child
|
164
158
|
@is_child = true
|
159
|
+
target_obj = (@obj.class.name == 'String')? Object.const_get(@obj).new : @obj
|
160
|
+
while($keep_running)
|
161
|
+
break unless target_obj.send(:call)
|
162
|
+
end
|
165
163
|
end
|
166
164
|
end
|
167
165
|
end
|
metadata
CHANGED
@@ -1,68 +1,46 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: light-daemon
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.8
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 9
|
9
|
-
- 7
|
10
|
-
version: 0.9.7
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Yi Zhang
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2012-03-11 00:00:00 -08:00
|
19
|
-
default_executable:
|
12
|
+
date: 2012-11-21 00:00:00.000000000 Z
|
20
13
|
dependencies: []
|
21
|
-
|
22
14
|
description: A very simple and light ruby daemon API
|
23
15
|
email: yzhang.wa@gmail.com
|
24
16
|
executables: []
|
25
|
-
|
26
17
|
extensions: []
|
27
|
-
|
28
18
|
extra_rdoc_files: []
|
29
|
-
|
30
|
-
files:
|
19
|
+
files:
|
31
20
|
- README
|
32
21
|
- lib/light_daemon.rb
|
33
|
-
has_rdoc: true
|
34
22
|
homepage: http://github.com/yzhanginwa/light-daemon
|
35
23
|
licenses: []
|
36
|
-
|
37
24
|
post_install_message:
|
38
25
|
rdoc_options: []
|
39
|
-
|
40
|
-
require_paths:
|
26
|
+
require_paths:
|
41
27
|
- lib
|
42
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
28
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
29
|
none: false
|
44
|
-
requirements:
|
45
|
-
- -
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
|
48
|
-
|
49
|
-
- 0
|
50
|
-
version: "0"
|
51
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
35
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
segments:
|
58
|
-
- 0
|
59
|
-
version: "0"
|
36
|
+
requirements:
|
37
|
+
- - ! '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
60
40
|
requirements: []
|
61
|
-
|
62
41
|
rubyforge_project:
|
63
|
-
rubygems_version: 1.
|
42
|
+
rubygems_version: 1.8.24
|
64
43
|
signing_key:
|
65
44
|
specification_version: 3
|
66
45
|
summary: Light Daemon is awesome!
|
67
46
|
test_files: []
|
68
|
-
|