daemons 1.1.9 → 1.2.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.
- checksums.yaml +7 -0
- data/LICENSE +1 -1
- data/README.md +206 -0
- data/Releases +17 -0
- data/examples/call/call.rb +13 -16
- data/examples/call/call_monitor.rb +13 -17
- data/examples/daemonize/daemonize.rb +4 -8
- data/examples/run/ctrl_crash.rb +0 -1
- data/examples/run/ctrl_custom_logfiles.rb +18 -0
- data/examples/run/ctrl_exec.rb +0 -1
- data/examples/run/ctrl_exit.rb +0 -1
- data/examples/run/ctrl_keep_pid_files.rb +1 -3
- data/examples/run/ctrl_monitor.rb +0 -1
- data/examples/run/ctrl_monitor_multiple.rb +17 -0
- data/examples/run/ctrl_multiple.rb +0 -1
- data/examples/run/ctrl_ontop.rb +0 -1
- data/examples/run/ctrl_optionparser.rb +4 -6
- data/examples/run/ctrl_proc.rb +8 -9
- data/examples/run/ctrl_proc_multiple.rb +4 -6
- data/examples/run/ctrl_proc_rand.rb +2 -4
- data/examples/run/ctrl_proc_simple.rb +0 -1
- data/examples/run/myserver.rb +0 -1
- data/examples/run/myserver_crashing.rb +5 -5
- data/examples/run/myserver_exiting.rb +2 -2
- data/examples/run/myserver_hanging.rb +4 -5
- data/examples/run/myserver_slowstop.rb +5 -6
- data/lib/daemons.rb +66 -68
- data/lib/daemons/application.rb +171 -188
- data/lib/daemons/application_group.rb +99 -92
- data/lib/daemons/change_privilege.rb +3 -3
- data/lib/daemons/cmdline.rb +43 -54
- data/lib/daemons/controller.rb +36 -53
- data/lib/daemons/daemonize.rb +54 -64
- data/lib/daemons/etc_extension.rb +3 -2
- data/lib/daemons/exceptions.rb +10 -11
- data/lib/daemons/monitor.rb +60 -62
- data/lib/daemons/pid.rb +24 -56
- data/lib/daemons/pidfile.rb +38 -40
- data/lib/daemons/pidmem.rb +5 -9
- data/lib/daemons/version.rb +3 -0
- metadata +45 -45
- data/README +0 -214
- data/Rakefile +0 -90
- data/TODO +0 -2
- data/setup.rb +0 -1360
data/lib/daemons/application.rb
CHANGED
@@ -2,39 +2,37 @@ require 'daemons/pidfile'
|
|
2
2
|
require 'daemons/pidmem'
|
3
3
|
require 'daemons/change_privilege'
|
4
4
|
require 'daemons/daemonize'
|
5
|
+
require 'daemons/exceptions'
|
5
6
|
|
6
7
|
require 'timeout'
|
7
8
|
|
8
|
-
|
9
9
|
module Daemons
|
10
|
-
|
11
10
|
class Application
|
12
|
-
|
13
11
|
attr_accessor :app_argv
|
14
12
|
attr_accessor :controller_argv
|
15
|
-
|
13
|
+
|
16
14
|
# the Pid instance belonging to this application
|
17
15
|
attr_reader :pid
|
18
|
-
|
16
|
+
|
19
17
|
# the ApplicationGroup the application belongs to
|
20
18
|
attr_reader :group
|
21
|
-
|
19
|
+
|
22
20
|
# my private options
|
23
21
|
attr_reader :options
|
24
|
-
|
25
|
-
|
22
|
+
|
26
23
|
SIGNAL = (RUBY_PLATFORM =~ /win32/ ? 'KILL' : 'TERM')
|
27
|
-
|
28
|
-
|
24
|
+
|
29
25
|
def initialize(group, add_options = {}, pid = nil)
|
30
26
|
@group = group
|
31
27
|
@options = group.options.dup
|
32
28
|
@options.update(add_options)
|
33
|
-
|
29
|
+
|
34
30
|
@dir_mode = @dir = @script = nil
|
35
|
-
|
31
|
+
|
36
32
|
@force_kill_waittime = @options[:force_kill_waittime] || 20
|
37
|
-
|
33
|
+
|
34
|
+
@show_status_callback = method(:default_show_status)
|
35
|
+
|
38
36
|
unless @pid = pid
|
39
37
|
if @options[:no_pidfiles]
|
40
38
|
@pid = PidMem.new
|
@@ -45,21 +43,25 @@ module Daemons
|
|
45
43
|
end
|
46
44
|
end
|
47
45
|
end
|
48
|
-
|
46
|
+
|
47
|
+
def show_status_callback=(function)
|
48
|
+
@show_status_callback = method(function)
|
49
|
+
end
|
50
|
+
|
49
51
|
def change_privilege
|
50
52
|
user = options[:user]
|
51
53
|
group = options[:group]
|
52
54
|
CurrentProcess.change_privilege(user, group) if user
|
53
55
|
end
|
54
|
-
|
56
|
+
|
55
57
|
def script
|
56
58
|
@script || @group.script
|
57
59
|
end
|
58
|
-
|
60
|
+
|
59
61
|
def pidfile_dir
|
60
62
|
Pid.dir(@dir_mode || @group.dir_mode, @dir || @group.dir, @script || @group.script)
|
61
63
|
end
|
62
|
-
|
64
|
+
|
63
65
|
def logdir
|
64
66
|
logdir = options[:log_dir]
|
65
67
|
unless logdir
|
@@ -67,15 +69,31 @@ module Daemons
|
|
67
69
|
end
|
68
70
|
logdir
|
69
71
|
end
|
72
|
+
|
73
|
+
def output_logfilename
|
74
|
+
filename = options[:output_logfilename]
|
75
|
+
unless filename
|
76
|
+
filename = @group.app_name + '.output'
|
77
|
+
end
|
78
|
+
filename
|
79
|
+
end
|
70
80
|
|
71
81
|
def output_logfile
|
72
|
-
(options[:log_output] && logdir) ? File.join(logdir,
|
82
|
+
(options[:log_output] && logdir) ? File.join(logdir, output_logfilename) : nil
|
83
|
+
end
|
84
|
+
|
85
|
+
def logfilename
|
86
|
+
filename = options[:logfilename]
|
87
|
+
unless filename
|
88
|
+
filename = @group.app_name + '.log'
|
89
|
+
end
|
90
|
+
filename
|
73
91
|
end
|
74
92
|
|
75
93
|
def logfile
|
76
|
-
logdir ? File.join(logdir,
|
94
|
+
logdir ? File.join(logdir, logfilename) : nil
|
77
95
|
end
|
78
|
-
|
96
|
+
|
79
97
|
# this function is only used to daemonize the currently running process (Daemons.daemonize)
|
80
98
|
def start_none
|
81
99
|
unless options[:ontop]
|
@@ -83,163 +101,159 @@ module Daemons
|
|
83
101
|
else
|
84
102
|
Daemonize.simulate(output_logfile)
|
85
103
|
end
|
86
|
-
|
104
|
+
|
87
105
|
@pid.pid = Process.pid
|
88
|
-
|
89
|
-
|
106
|
+
|
90
107
|
# We need this to remove the pid-file if the applications exits by itself.
|
91
|
-
# Note that <tt>at_text</tt> will only be run if the applications exits by calling
|
108
|
+
# Note that <tt>at_text</tt> will only be run if the applications exits by calling
|
92
109
|
# <tt>exit</tt>, and not if it calls <tt>exit!</tt> (so please don't call <tt>exit!</tt>
|
93
110
|
# in your application!
|
94
111
|
#
|
95
|
-
at_exit
|
112
|
+
at_exit do
|
96
113
|
begin; @pid.cleanup; rescue ::Exception; end
|
97
|
-
|
114
|
+
|
98
115
|
# If the option <tt>:backtrace</tt> is used and the application did exit by itself
|
99
116
|
# create a exception log.
|
100
|
-
if options[:backtrace]
|
101
|
-
begin; exception_log
|
117
|
+
if options[:backtrace] && !options[:ontop] && !$daemons_sigterm
|
118
|
+
begin; exception_log; rescue ::Exception; end
|
102
119
|
end
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
# This part is needed to remove the pid-file if the application is killed by
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
# This part is needed to remove the pid-file if the application is killed by
|
107
124
|
# daemons or manually by the user.
|
108
125
|
# Note that the applications is not supposed to overwrite the signal handler for
|
109
126
|
# 'TERM'.
|
110
127
|
#
|
111
|
-
trap(SIGNAL)
|
128
|
+
trap(SIGNAL) do
|
112
129
|
begin; @pid.cleanup; rescue ::Exception; end
|
113
130
|
$daemons_sigterm = true
|
114
|
-
|
131
|
+
|
115
132
|
if options[:hard_exit]
|
116
133
|
exit!
|
117
134
|
else
|
118
135
|
exit
|
119
136
|
end
|
120
|
-
|
137
|
+
end
|
121
138
|
end
|
122
|
-
|
139
|
+
|
123
140
|
def start_exec
|
124
141
|
if options[:backtrace]
|
125
|
-
puts
|
142
|
+
puts 'option :backtrace is not supported with :mode => :exec, ignoring'
|
126
143
|
end
|
127
|
-
|
144
|
+
|
128
145
|
unless options[:ontop]
|
129
146
|
Daemonize.daemonize(output_logfile, @group.app_name)
|
130
147
|
else
|
131
148
|
Daemonize.simulate(output_logfile)
|
132
149
|
end
|
133
|
-
|
150
|
+
|
134
151
|
# note that we cannot remove the pid file if we run in :ontop mode (i.e. 'ruby ctrl_exec.rb run')
|
135
152
|
@pid.pid = Process.pid
|
136
|
-
|
137
|
-
ENV['DAEMONS_ARGV'] = @controller_argv.join(' ')
|
153
|
+
|
154
|
+
ENV['DAEMONS_ARGV'] = @controller_argv.join(' ')
|
138
155
|
# haven't tested yet if this is really passed to the exec'd process...
|
139
|
-
|
140
|
-
started
|
141
|
-
Kernel.exec(script
|
156
|
+
|
157
|
+
started
|
158
|
+
Kernel.exec(script, *(@app_argv || []))
|
142
159
|
end
|
143
|
-
|
160
|
+
|
144
161
|
def start_load
|
145
162
|
unless options[:ontop]
|
146
163
|
Daemonize.daemonize(output_logfile, @group.app_name)
|
147
164
|
else
|
148
165
|
Daemonize.simulate(output_logfile)
|
149
166
|
end
|
150
|
-
|
167
|
+
|
151
168
|
@pid.pid = Process.pid
|
152
|
-
|
153
|
-
|
169
|
+
|
154
170
|
# We need this to remove the pid-file if the applications exits by itself.
|
155
|
-
# Note that <tt>at_exit</tt> will only be run if the applications exits by calling
|
171
|
+
# Note that <tt>at_exit</tt> will only be run if the applications exits by calling
|
156
172
|
# <tt>exit</tt>, and not if it calls <tt>exit!</tt> (so please don't call <tt>exit!</tt>
|
157
173
|
# in your application!
|
158
174
|
#
|
159
|
-
at_exit
|
175
|
+
at_exit do
|
160
176
|
begin; @pid.cleanup; rescue ::Exception; end
|
161
|
-
|
177
|
+
|
162
178
|
# If the option <tt>:backtrace</tt> is used and the application did exit by itself
|
163
179
|
# create a exception log.
|
164
|
-
if options[:backtrace]
|
165
|
-
begin; exception_log
|
180
|
+
if options[:backtrace] && !options[:ontop] && !$daemons_sigterm
|
181
|
+
begin; exception_log; rescue ::Exception; end
|
166
182
|
end
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
# This part is needed to remove the pid-file if the application is killed by
|
183
|
+
|
184
|
+
end
|
185
|
+
|
186
|
+
# This part is needed to remove the pid-file if the application is killed by
|
171
187
|
# daemons or manually by the user.
|
172
188
|
# Note that the applications is not supposed to overwrite the signal handler for
|
173
189
|
# 'TERM'.
|
174
190
|
#
|
175
191
|
$daemons_stop_proc = options[:stop_proc]
|
176
|
-
trap(SIGNAL)
|
192
|
+
trap(SIGNAL) do
|
177
193
|
begin
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
194
|
+
if $daemons_stop_proc
|
195
|
+
$daemons_stop_proc.call
|
196
|
+
end
|
197
|
+
rescue ::Exception
|
182
198
|
end
|
183
|
-
|
199
|
+
|
184
200
|
begin; @pid.cleanup; rescue ::Exception; end
|
185
201
|
$daemons_sigterm = true
|
186
|
-
|
202
|
+
|
187
203
|
if options[:hard_exit]
|
188
204
|
exit!
|
189
205
|
else
|
190
206
|
exit
|
191
207
|
end
|
192
|
-
|
193
|
-
|
208
|
+
end
|
209
|
+
|
194
210
|
# Now we really start the script...
|
195
211
|
$DAEMONS_ARGV = @controller_argv
|
196
212
|
ENV['DAEMONS_ARGV'] = @controller_argv.join(' ')
|
197
|
-
|
213
|
+
|
198
214
|
ARGV.clear
|
199
215
|
ARGV.concat @app_argv if @app_argv
|
200
|
-
|
201
|
-
started
|
216
|
+
|
217
|
+
started
|
202
218
|
# TODO: begin - rescue - end around this and exception logging
|
203
|
-
load script
|
219
|
+
load script
|
204
220
|
end
|
205
|
-
|
221
|
+
|
206
222
|
def start_proc
|
207
223
|
return unless p = options[:proc]
|
208
|
-
|
209
|
-
myproc = proc do
|
210
|
-
|
211
|
-
@pid.pid = Process.pid
|
212
|
-
|
224
|
+
|
225
|
+
myproc = proc do
|
226
|
+
|
213
227
|
# We need this to remove the pid-file if the applications exits by itself.
|
214
|
-
# Note that <tt>at_text</tt> will only be run if the applications exits by calling
|
228
|
+
# Note that <tt>at_text</tt> will only be run if the applications exits by calling
|
215
229
|
# <tt>exit</tt>, and not if it calls <tt>exit!</tt> (so please don't call <tt>exit!</tt>
|
216
230
|
# in your application!
|
217
231
|
#
|
218
|
-
at_exit
|
232
|
+
at_exit do
|
219
233
|
begin; @pid.cleanup; rescue ::Exception; end
|
220
234
|
|
221
235
|
# If the option <tt>:backtrace</tt> is used and the application did exit by itself
|
222
236
|
# create a exception log.
|
223
|
-
if options[:backtrace]
|
224
|
-
begin; exception_log
|
237
|
+
if options[:backtrace] && !options[:ontop] && !$daemons_sigterm
|
238
|
+
begin; exception_log; rescue ::Exception; end
|
225
239
|
end
|
226
240
|
|
227
|
-
|
241
|
+
end
|
228
242
|
|
229
|
-
# This part is needed to remove the pid-file if the application is killed by
|
243
|
+
# This part is needed to remove the pid-file if the application is killed by
|
230
244
|
# daemons or manually by the user.
|
231
245
|
# Note that the applications is not supposed to overwrite the signal handler for
|
232
246
|
# 'TERM'.
|
233
247
|
#
|
234
248
|
$daemons_stop_proc = options[:stop_proc]
|
235
|
-
trap(SIGNAL)
|
249
|
+
trap(SIGNAL) do
|
236
250
|
begin
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
251
|
+
if $daemons_stop_proc
|
252
|
+
$daemons_stop_proc.call
|
253
|
+
end
|
254
|
+
rescue ::Exception
|
241
255
|
end
|
242
|
-
|
256
|
+
|
243
257
|
begin; @pid.cleanup; rescue ::Exception; end
|
244
258
|
$daemons_sigterm = true
|
245
259
|
|
@@ -248,42 +262,28 @@ module Daemons
|
|
248
262
|
else
|
249
263
|
exit
|
250
264
|
end
|
251
|
-
|
252
|
-
|
253
|
-
started()
|
254
|
-
|
255
|
-
p.call()
|
265
|
+
end
|
266
|
+
p.call
|
256
267
|
end
|
257
|
-
|
268
|
+
|
258
269
|
unless options[:ontop]
|
259
|
-
Daemonize.call_as_daemon(myproc, output_logfile, @group.app_name)
|
260
|
-
|
270
|
+
@pid.pid = Daemonize.call_as_daemon(myproc, output_logfile, @group.app_name)
|
271
|
+
|
261
272
|
else
|
262
273
|
Daemonize.simulate(output_logfile)
|
263
|
-
|
274
|
+
|
264
275
|
myproc.call
|
265
|
-
|
266
|
-
# why did we use this??
|
267
|
-
# Thread.new(&options[:proc])
|
268
|
-
|
269
|
-
# why did we use the code below??
|
270
|
-
# unless pid = Process.fork
|
271
|
-
# @pid.pid = pid
|
272
|
-
# Daemonize.simulate(logfile)
|
273
|
-
# options[:proc].call
|
274
|
-
# exit
|
275
|
-
# else
|
276
|
-
# Process.detach(@pid.pid)
|
277
|
-
# end
|
278
276
|
end
|
279
|
-
|
277
|
+
started
|
280
278
|
end
|
281
|
-
|
282
|
-
|
283
|
-
def start
|
279
|
+
|
280
|
+
def start(restart = false)
|
284
281
|
change_privilege
|
285
|
-
|
286
|
-
|
282
|
+
|
283
|
+
unless restart
|
284
|
+
@group.create_monitor(self) unless options[:ontop] # we don't monitor applications in the foreground
|
285
|
+
end
|
286
|
+
|
287
287
|
case options[:mode]
|
288
288
|
when :none
|
289
289
|
# this is only used to daemonize the currently running process
|
@@ -298,32 +298,15 @@ module Daemons
|
|
298
298
|
start_load
|
299
299
|
end
|
300
300
|
end
|
301
|
-
|
301
|
+
|
302
302
|
def started
|
303
303
|
if pid = @pid.pid
|
304
|
-
puts "#{
|
304
|
+
puts "#{group.app_name}: process with pid #{pid} started."
|
305
305
|
STDOUT.flush
|
306
306
|
end
|
307
307
|
end
|
308
|
-
|
309
|
-
|
310
|
-
# def run
|
311
|
-
# if @group.controller.options[:exec]
|
312
|
-
# run_via_exec()
|
313
|
-
# else
|
314
|
-
# run_via_load()
|
315
|
-
# end
|
316
|
-
# end
|
317
|
-
#
|
318
|
-
# def run_via_exec
|
319
|
-
#
|
320
|
-
# end
|
321
|
-
#
|
322
|
-
# def run_via_load
|
323
|
-
#
|
324
|
-
# end
|
325
|
-
|
326
|
-
def reload
|
308
|
+
|
309
|
+
def reload
|
327
310
|
if @pid.pid == 0
|
328
311
|
zap
|
329
312
|
start
|
@@ -347,44 +330,43 @@ module Daemons
|
|
347
330
|
#
|
348
331
|
def exception_log
|
349
332
|
return unless logfile
|
350
|
-
|
333
|
+
|
351
334
|
require 'logger'
|
352
|
-
|
335
|
+
|
353
336
|
l_file = Logger.new(logfile)
|
354
|
-
|
337
|
+
|
355
338
|
# the code below finds the last exception
|
356
339
|
e = nil
|
357
|
-
|
358
|
-
ObjectSpace.each_object
|
340
|
+
|
341
|
+
ObjectSpace.each_object do |o|
|
359
342
|
if ::Exception === o
|
360
343
|
e = o
|
361
344
|
end
|
362
|
-
|
363
|
-
|
364
|
-
l_file.info
|
345
|
+
end
|
346
|
+
|
347
|
+
l_file.info '*** below you find the most recent exception thrown, this will be likely (but not certainly) the exception that made the application exit abnormally ***'
|
365
348
|
l_file.error e
|
366
|
-
|
367
|
-
l_file.info
|
368
|
-
|
349
|
+
|
350
|
+
l_file.info '*** below you find all exception objects found in memory, some of them may have been thrown in your application, others may just be in memory because they are standard exceptions ***'
|
351
|
+
|
369
352
|
# this code logs every exception found in memory
|
370
|
-
ObjectSpace.each_object
|
353
|
+
ObjectSpace.each_object do |o|
|
371
354
|
if ::Exception === o
|
372
355
|
l_file.error o
|
373
356
|
end
|
374
|
-
|
375
|
-
|
357
|
+
end
|
358
|
+
|
376
359
|
l_file.close
|
377
360
|
end
|
378
|
-
|
379
|
-
|
361
|
+
|
380
362
|
def stop(no_wait = false)
|
381
|
-
|
382
|
-
|
363
|
+
unless running?
|
364
|
+
zap
|
383
365
|
return
|
384
366
|
end
|
385
|
-
|
367
|
+
|
386
368
|
pid = @pid.pid
|
387
|
-
|
369
|
+
|
388
370
|
# Catch errors when trying to kill a process that doesn't
|
389
371
|
# exist. This happens when the process quits and hasn't been
|
390
372
|
# restarted by the monitor yet. By catching the error, we allow the
|
@@ -393,71 +375,73 @@ module Daemons
|
|
393
375
|
Process.kill(SIGNAL, pid)
|
394
376
|
rescue Errno::ESRCH => e
|
395
377
|
puts "#{e} #{pid}"
|
396
|
-
puts
|
378
|
+
puts 'deleting pid-file.'
|
397
379
|
end
|
398
|
-
|
399
|
-
|
380
|
+
|
381
|
+
unless no_wait
|
400
382
|
if @force_kill_waittime > 0
|
401
|
-
puts "#{
|
383
|
+
puts "#{group.app_name}: trying to stop process with pid #{pid}..."
|
402
384
|
STDOUT.flush
|
403
|
-
|
385
|
+
|
404
386
|
begin
|
405
|
-
Timeout
|
387
|
+
Timeout.timeout(@force_kill_waittime, TimeoutError) do
|
406
388
|
while Pid.running?(pid)
|
407
389
|
sleep(0.2)
|
408
390
|
end
|
409
|
-
|
410
|
-
rescue
|
411
|
-
puts "#{
|
391
|
+
end
|
392
|
+
rescue TimeoutError
|
393
|
+
puts "#{group.app_name}: process with pid #{pid} won't stop, we forcefully kill it..."
|
412
394
|
STDOUT.flush
|
413
|
-
|
395
|
+
|
414
396
|
begin
|
415
397
|
Process.kill('KILL', pid)
|
416
398
|
rescue Errno::ESRCH
|
417
399
|
end
|
418
|
-
|
400
|
+
|
419
401
|
begin
|
420
|
-
Timeout
|
402
|
+
Timeout.timeout(20, TimeoutError) do
|
421
403
|
while Pid.running?(pid)
|
422
404
|
sleep(1)
|
423
405
|
end
|
424
|
-
|
425
|
-
rescue
|
426
|
-
puts "#{
|
406
|
+
end
|
407
|
+
rescue TimeoutError
|
408
|
+
puts "#{group.app_name}: unable to forcefully kill process with pid #{pid}."
|
427
409
|
STDOUT.flush
|
428
410
|
end
|
429
411
|
end
|
430
412
|
end
|
431
|
-
|
432
|
-
|
413
|
+
|
433
414
|
end
|
434
|
-
|
415
|
+
|
435
416
|
sleep(0.1)
|
436
417
|
unless Pid.running?(pid)
|
437
418
|
# We try to remove the pid-files by ourselves, in case the application
|
438
419
|
# didn't clean it up.
|
439
420
|
begin; @pid.cleanup; rescue ::Exception; end
|
440
|
-
|
441
|
-
puts "#{
|
421
|
+
|
422
|
+
puts "#{group.app_name}: process with pid #{pid} successfully stopped."
|
442
423
|
STDOUT.flush
|
443
424
|
end
|
444
|
-
|
445
425
|
end
|
446
|
-
|
426
|
+
|
447
427
|
def zap
|
448
428
|
@pid.cleanup
|
449
429
|
end
|
450
|
-
|
430
|
+
|
451
431
|
def zap!
|
452
432
|
begin; @pid.cleanup; rescue ::Exception; end
|
453
433
|
end
|
454
|
-
|
434
|
+
|
455
435
|
def show_status
|
456
|
-
|
457
|
-
|
458
|
-
puts "#{self.group.app_name}: #{running ? '' : 'not '}running#{(running and @pid.exist?) ? ' [pid ' + @pid.pid.to_s + ']' : ''}#{(@pid.exist? and not running) ? ' (but pid-file exists: ' + @pid.pid.to_s + ')' : ''}"
|
436
|
+
@show_status_callback.call(self)
|
459
437
|
end
|
460
|
-
|
438
|
+
|
439
|
+
def default_show_status(daemon = self)
|
440
|
+
running = daemon.running?
|
441
|
+
|
442
|
+
puts "#{group.app_name}: #{running ? '' : 'not '}running#{(running and daemon.pid.exist?) ? ' [pid ' + daemon.pid.pid.to_s + ']' : ''}#{(daemon.pid.exist? and not running) ? ' (but pid-file exists: ' + daemon.pid.pid.to_s + ')' : ''}"
|
443
|
+
end
|
444
|
+
|
461
445
|
# This function implements a (probably too simle) method to detect
|
462
446
|
# whether the program with the pid found in the pid-file is still running.
|
463
447
|
# It just searches for the pid in the output of <tt>ps ax</tt>, which
|
@@ -469,9 +453,8 @@ module Daemons
|
|
469
453
|
if @pid.exist?
|
470
454
|
return Pid.running?(@pid.pid)
|
471
455
|
end
|
472
|
-
|
473
|
-
|
456
|
+
|
457
|
+
false
|
474
458
|
end
|
475
459
|
end
|
476
|
-
|
477
460
|
end
|