pidly 0.1.0 → 0.1.1
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/ChangeLog.rdoc +6 -1
- data/README.md +24 -24
- data/lib/pidly/callbacks.rb +37 -36
- data/lib/pidly/control.rb +62 -43
- data/lib/pidly/version.rb +1 -1
- data/spec/control_spec.rb +14 -12
- metadata +3 -3
data/ChangeLog.rdoc
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# pidly
|
2
2
|
|
3
|
-
* [Homepage]
|
4
|
-
* [Documentation]
|
3
|
+
* [Homepage](https://github.com/mephux/pidly)
|
4
|
+
* [Documentation](http://rubydoc.info/github/mephux/pidly/master/frames)
|
5
5
|
|
6
6
|
## Description
|
7
7
|
|
@@ -10,34 +10,34 @@ daemon without getting in the way with forced verbose output and usage messages.
|
|
10
10
|
|
11
11
|
## Examples
|
12
12
|
|
13
|
-
|
13
|
+
require 'pidly'
|
14
14
|
|
15
|
-
|
15
|
+
class Test < Pidly::Control
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
before_start do
|
18
|
+
puts "BEFORE START #{@pid}"
|
19
|
+
end
|
20
20
|
|
21
|
-
|
21
|
+
start :when_daemon_starts
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
stop do
|
24
|
+
puts "Attempting to kill process: #{@pid}"
|
25
|
+
end
|
26
26
|
|
27
|
-
|
27
|
+
after_stop :test_after_daemon_stops
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
error do
|
30
|
+
puts "SENDING EMAIL | Error Count: #{@error_count}"
|
31
|
+
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
def when_daemon_starts
|
34
|
+
loop do
|
35
|
+
print "TEST FROM #{@pid}"
|
36
|
+
sleep 2
|
37
|
+
end
|
38
|
+
end
|
39
39
|
|
40
|
-
|
40
|
+
end
|
41
41
|
|
42
42
|
@daemon = Test.spawn(
|
43
43
|
:name => 'Test Daemon',
|
@@ -46,11 +46,11 @@ daemon without getting in the way with forced verbose output and usage messages.
|
|
46
46
|
)
|
47
47
|
|
48
48
|
# @daemon.send ARGV.first
|
49
|
-
@daemon.start # stop, status, restart, and kill.
|
49
|
+
@daemon.start # stop, status, restart, clean!, and kill.
|
50
50
|
|
51
51
|
## Install
|
52
52
|
|
53
|
-
|
53
|
+
$ gem install pidly
|
54
54
|
|
55
55
|
## Copyright
|
56
56
|
|
data/lib/pidly/callbacks.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
module Pidly
|
2
2
|
#
|
3
3
|
# Pidly before/after callbacks
|
4
|
-
#
|
4
|
+
#
|
5
5
|
module Callbacks
|
6
|
-
|
6
|
+
|
7
7
|
#
|
8
8
|
# Before start
|
9
|
-
#
|
10
|
-
# Right before the daemon is instructed to start the
|
9
|
+
#
|
10
|
+
# Right before the daemon is instructed to start the
|
11
11
|
# following callback will be invoked and executed.
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# @param [Symbol] callback Method name
|
14
14
|
# @yield [] Code to be executed upon callback invocation
|
15
15
|
#
|
16
|
-
# @example
|
16
|
+
# @example
|
17
17
|
# before_start :method_name
|
18
18
|
# # OR
|
19
19
|
# before_start { puts "#{@pid} is about to start!" }
|
@@ -21,53 +21,53 @@ module Pidly
|
|
21
21
|
def before_start(callback=nil, &block)
|
22
22
|
add_callback(:before_start, (callback || block))
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
#
|
26
26
|
# Start
|
27
|
-
#
|
28
|
-
# When the daemon is instructed to start the
|
27
|
+
#
|
28
|
+
# When the daemon is instructed to start the
|
29
29
|
# following callback will be invoked and executed.
|
30
|
-
#
|
30
|
+
#
|
31
31
|
# @param [Symbol] callback Method name
|
32
32
|
# @yield [] Code to be executed upon callback invocation
|
33
33
|
#
|
34
|
-
# @example
|
34
|
+
# @example
|
35
35
|
# start :method_name
|
36
36
|
# # OR
|
37
37
|
# start { puts "Daemon Started!" }
|
38
|
-
#
|
38
|
+
#
|
39
39
|
def start(callback=nil, &block)
|
40
40
|
add_callback(:start, (callback || block))
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
#
|
44
44
|
# Stop
|
45
|
-
#
|
46
|
-
# When the daemon is instructed to stop the
|
45
|
+
#
|
46
|
+
# When the daemon is instructed to stop the
|
47
47
|
# following callback will be invoked and executed.
|
48
|
-
#
|
48
|
+
#
|
49
49
|
# @param [Symbol] callback Method name
|
50
50
|
# @yield [] Code to be executed upon callback invocation
|
51
|
-
#
|
52
|
-
# @example
|
51
|
+
#
|
52
|
+
# @example
|
53
53
|
# stop :method_name
|
54
54
|
# # OR
|
55
55
|
# stop { puts "Attempting to stop #{@name} with pid #{@pid}!" }
|
56
|
-
#
|
56
|
+
#
|
57
57
|
def stop(callback=nil, &block)
|
58
58
|
add_callback(:stop, (callback || block))
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
#
|
62
62
|
# After stop
|
63
|
-
#
|
64
|
-
# Right after the daemon is instructed to stop the
|
63
|
+
#
|
64
|
+
# Right after the daemon is instructed to stop the
|
65
65
|
# following callback will be invoked and executed.
|
66
|
-
#
|
66
|
+
#
|
67
67
|
# @param [Symbol] callback Method name
|
68
68
|
# @yield [] Code to be executed upon callback invocation
|
69
69
|
#
|
70
|
-
# @example
|
70
|
+
# @example
|
71
71
|
# after_start :method_name
|
72
72
|
# # OR
|
73
73
|
# after_start { puts "#{@pid} was just killed!" }
|
@@ -75,17 +75,17 @@ module Pidly
|
|
75
75
|
def after_stop(callback=nil, &block)
|
76
76
|
add_callback(:after_stop, (callback || block))
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
#
|
80
80
|
# Error
|
81
|
-
#
|
81
|
+
#
|
82
82
|
# If the daemon encounters an error or an exception is raised
|
83
83
|
# the following callback will be invoked and executed.
|
84
|
-
#
|
84
|
+
#
|
85
85
|
# @param [Symbol] callback Method name
|
86
86
|
# @yield [] Code to be executed upon callback invocation
|
87
87
|
#
|
88
|
-
# @example
|
88
|
+
# @example
|
89
89
|
# error :send_error_email
|
90
90
|
# # OR
|
91
91
|
# error { puts "ZOMG! #{@name} failed!" }
|
@@ -96,25 +96,26 @@ module Pidly
|
|
96
96
|
|
97
97
|
#
|
98
98
|
# Add callback
|
99
|
-
#
|
99
|
+
#
|
100
100
|
# @param [Symbol] callback Callback method name
|
101
101
|
# @param [Symbol, nil] invoke Method to call
|
102
102
|
# @yield [] Code to be executed upon callback invocation
|
103
|
-
#
|
103
|
+
#
|
104
104
|
def add_callback(callback, invoke)
|
105
|
-
Control.
|
105
|
+
Control.instance_eval do
|
106
|
+
class_variable_set(:"@@#{callback}", invoke)
|
107
|
+
end
|
106
108
|
end
|
107
109
|
|
108
110
|
#
|
109
111
|
# Extend and include callback methods
|
110
|
-
#
|
112
|
+
#
|
111
113
|
# @param [Class] receiver The calling class
|
112
|
-
#
|
114
|
+
#
|
113
115
|
def self.included(receiver)
|
114
|
-
puts receiver.class
|
115
116
|
receiver.extend self
|
116
117
|
end
|
117
118
|
|
118
119
|
end # modle Callbacks
|
119
|
-
|
120
|
-
end # module Pidly
|
120
|
+
|
121
|
+
end # module Pidly
|
data/lib/pidly/control.rb
CHANGED
@@ -16,7 +16,7 @@ module Pidly
|
|
16
16
|
|
17
17
|
# Include callbacks
|
18
18
|
include Pidly::Callbacks
|
19
|
-
|
19
|
+
|
20
20
|
# Include logging helpers
|
21
21
|
include Pidly::Logger
|
22
22
|
|
@@ -28,13 +28,13 @@ module Pidly
|
|
28
28
|
# Initialize control object
|
29
29
|
#
|
30
30
|
# @param [Hash] options The options to create a controller with.
|
31
|
-
#
|
32
|
-
# @raise [RuntimeError]
|
31
|
+
#
|
32
|
+
# @raise [RuntimeError]
|
33
33
|
# Raise exception if path does not exist
|
34
|
-
#
|
35
|
-
# @raise [RuntimeError]
|
34
|
+
#
|
35
|
+
# @raise [RuntimeError]
|
36
36
|
# Raise exception if path is not readable or writable.
|
37
|
-
#
|
37
|
+
#
|
38
38
|
def initialize(options={})
|
39
39
|
|
40
40
|
@messages = []
|
@@ -88,28 +88,28 @@ module Pidly
|
|
88
88
|
# Spawn
|
89
89
|
#
|
90
90
|
# @param [Hash] options The options to create a controller with.
|
91
|
-
#
|
91
|
+
#
|
92
92
|
# @option options [String] :name Daemon name
|
93
|
-
#
|
93
|
+
#
|
94
94
|
# @option options [String] :path Path to create the log/pids directory
|
95
|
-
#
|
95
|
+
#
|
96
96
|
# @option options [String] :pid_file Pid file path
|
97
|
-
#
|
97
|
+
#
|
98
98
|
# @option options [String] :log_file Log file path
|
99
|
-
#
|
99
|
+
#
|
100
100
|
# @option options [true, false] :sync_log Synchronize log files
|
101
|
-
#
|
102
|
-
# @option options [true, false] :allow_multiple
|
101
|
+
#
|
102
|
+
# @option options [true, false] :allow_multiple
|
103
103
|
# Allow multiple daemons of the same type
|
104
|
-
#
|
104
|
+
#
|
105
105
|
# @option options [true, false] :sync_log Synchronize log files
|
106
|
-
#
|
106
|
+
#
|
107
107
|
# @option options [String] :signal Trap signal
|
108
|
-
#
|
108
|
+
#
|
109
109
|
# @option options [Integer] :timeout Timeout for Process#wait
|
110
|
-
#
|
110
|
+
#
|
111
111
|
# @option options [true, false] :verbose Display daemon messages
|
112
|
-
#
|
112
|
+
#
|
113
113
|
# @option options [true, false] :logger Enable daemon logging
|
114
114
|
#
|
115
115
|
# @return [Control] Control object
|
@@ -117,12 +117,12 @@ module Pidly
|
|
117
117
|
def self.spawn(options={})
|
118
118
|
@daemon = new(options)
|
119
119
|
end
|
120
|
-
|
120
|
+
|
121
121
|
#
|
122
122
|
# Start
|
123
|
-
#
|
123
|
+
#
|
124
124
|
# Validate callbacks and start daemon
|
125
|
-
#
|
125
|
+
#
|
126
126
|
def start
|
127
127
|
validate_files_and_paths!
|
128
128
|
validate_callbacks!
|
@@ -156,7 +156,7 @@ module Pidly
|
|
156
156
|
STDOUT.reopen log
|
157
157
|
STDERR.reopen STDOUT
|
158
158
|
end
|
159
|
-
|
159
|
+
|
160
160
|
trap("TERM") do
|
161
161
|
stop
|
162
162
|
end
|
@@ -181,12 +181,12 @@ module Pidly
|
|
181
181
|
STDERR.puts message.backtrace
|
182
182
|
execute_callback(:error)
|
183
183
|
end
|
184
|
-
|
184
|
+
|
185
185
|
#
|
186
186
|
# Stop
|
187
|
-
#
|
187
|
+
#
|
188
188
|
# Stop daemon and remove pid file
|
189
|
-
#
|
189
|
+
#
|
190
190
|
def stop
|
191
191
|
|
192
192
|
if running?
|
@@ -211,19 +211,19 @@ module Pidly
|
|
211
211
|
|
212
212
|
else
|
213
213
|
FileUtils.rm(@pid_file) if File.exists?(@pid_file)
|
214
|
-
log(:info, "PID file not found.
|
214
|
+
log(:info, "PID file not found.")
|
215
215
|
end
|
216
216
|
|
217
217
|
rescue Errno::ENOENT
|
218
218
|
end
|
219
|
-
|
219
|
+
|
220
220
|
#
|
221
221
|
# Status
|
222
|
-
#
|
222
|
+
#
|
223
223
|
# Return current daemon status and pid
|
224
|
-
#
|
224
|
+
#
|
225
225
|
# @return [String] Status
|
226
|
-
#
|
226
|
+
#
|
227
227
|
def status
|
228
228
|
if running?
|
229
229
|
log(:info, "#{@name} is running (PID #{@pid})")
|
@@ -231,21 +231,21 @@ module Pidly
|
|
231
231
|
log(:info, "#{@name} is NOT running")
|
232
232
|
end
|
233
233
|
end
|
234
|
-
|
234
|
+
|
235
235
|
#
|
236
236
|
# Restart
|
237
|
-
#
|
237
|
+
#
|
238
238
|
# Restart the daemon
|
239
|
-
#
|
239
|
+
#
|
240
240
|
def restart
|
241
241
|
stop; sleep 1 while running?; start
|
242
242
|
end
|
243
|
-
|
243
|
+
|
244
244
|
#
|
245
245
|
# Kill
|
246
|
-
#
|
246
|
+
#
|
247
247
|
# @param [String] remove_pid_file Remove the daemon pid file
|
248
|
-
#
|
248
|
+
#
|
249
249
|
def kill(remove_pid_file=true)
|
250
250
|
if running?
|
251
251
|
log(:info, "Killing #{@name} (PID #{@pid})")
|
@@ -255,12 +255,12 @@ module Pidly
|
|
255
255
|
FileUtils.rm(@pid_file) if remove_pid_file
|
256
256
|
rescue Errno::ENOENT
|
257
257
|
end
|
258
|
-
|
258
|
+
|
259
259
|
#
|
260
260
|
# Running?
|
261
|
-
#
|
261
|
+
#
|
262
262
|
# @return [true, false] Return the running status of the daemon.
|
263
|
-
#
|
263
|
+
#
|
264
264
|
def running?
|
265
265
|
Process.kill 0, @pid
|
266
266
|
true
|
@@ -271,7 +271,18 @@ module Pidly
|
|
271
271
|
rescue
|
272
272
|
false
|
273
273
|
end
|
274
|
-
|
274
|
+
|
275
|
+
#
|
276
|
+
# Clean
|
277
|
+
#
|
278
|
+
# Remove all files created by the daemon.
|
279
|
+
#
|
280
|
+
def clean!
|
281
|
+
FileUtils.rm(@log_file)
|
282
|
+
FileUtils.rm(@pid_file)
|
283
|
+
rescue Errno::ENOENT
|
284
|
+
end
|
285
|
+
|
275
286
|
def validate_files_and_paths!
|
276
287
|
log = Pathname.new(@log_file).dirname
|
277
288
|
pid = Pathname.new(@pid_file).dirname
|
@@ -294,8 +305,7 @@ module Pidly
|
|
294
305
|
def execute_callback(callback_name)
|
295
306
|
@error_count += 1 if callback_name == :error
|
296
307
|
|
297
|
-
if
|
298
|
-
callback = Control.class_variable_get(:"@@#{callback_name}")
|
308
|
+
if (callback = fetch_class_var(callback_name))
|
299
309
|
|
300
310
|
if callback.kind_of?(Symbol)
|
301
311
|
|
@@ -323,8 +333,17 @@ module Pidly
|
|
323
333
|
nil
|
324
334
|
end
|
325
335
|
|
336
|
+
def fetch_class_var(name)
|
337
|
+
if Control.class_variable_defined?(:"@@#{name}")
|
338
|
+
Control.instance_eval do
|
339
|
+
return class_variable_get(:"@@#{name}")
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
326
344
|
private :validate_callbacks!, :fetch_pid,
|
327
|
-
:validate_files_and_paths!, :execute_callback
|
345
|
+
:validate_files_and_paths!, :execute_callback,
|
346
|
+
:fetch_class_var
|
328
347
|
|
329
348
|
end # class Control
|
330
349
|
|
data/lib/pidly/version.rb
CHANGED
data/spec/control_spec.rb
CHANGED
@@ -17,49 +17,51 @@ describe Control do
|
|
17
17
|
it "should be running" do
|
18
18
|
@daemon.running?.should == true
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
it "should have an active status, name and pid" do
|
22
22
|
@daemon.status
|
23
23
|
reply = "#{@daemon.name} is running (PID #{@daemon.pid})"
|
24
24
|
@daemon.messages.last.should == reply
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
it "should have the correct pid path" do
|
28
28
|
@daemon.pid_file.should == "/tmp/pids/#{@daemon.name}.pid"
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
it "should have a pid file that exists" do
|
32
32
|
File.exists?("/tmp/pids/#{@daemon.name}.pid").should == true
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
it "should have the correct log file" do
|
36
36
|
@daemon.log_file.should == "/tmp/logs/#{@daemon.name}.log"
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
it "should have a log file that exists" do
|
40
40
|
File.exists?("/tmp/logs/#{@daemon.name}.log").should == true
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
it "should fail when trying to start another daemon" do
|
44
44
|
@daemon.start
|
45
45
|
reply = "#{@daemon.name} is already running (PID #{@daemon.pid})"
|
46
|
-
|
46
|
+
|
47
47
|
@daemon.messages.last.should == reply
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
it "should write to the log file" do
|
51
51
|
file = File.open(@daemon.log_file, 'r')
|
52
52
|
file.read.should =~ /TEST FROM #{@daemon.pid}/
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
it "should write to the pid file" do
|
56
56
|
file = File.open(@daemon.pid_file, 'r')
|
57
57
|
file.read.should =~ /#{@daemon.pid}/
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
after(:all) do
|
61
|
-
|
62
|
-
|
61
|
+
if @daemon
|
62
|
+
@daemon.kill
|
63
|
+
@daemon.clean!
|
64
|
+
end
|
63
65
|
end
|
64
66
|
|
65
67
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: pidly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Dustin Willis Webber
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-04-
|
13
|
+
date: 2011-04-07 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -99,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
99
|
requirements: []
|
100
100
|
|
101
101
|
rubyforge_project: pidly
|
102
|
-
rubygems_version: 1.
|
102
|
+
rubygems_version: 1.5.0
|
103
103
|
signing_key:
|
104
104
|
specification_version: 3
|
105
105
|
summary: A super simple daemon library.
|