asir 1.2.3 → 1.2.5
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 +14 -0
- data/example/config/asir_config.rb +3 -1
- data/lib/asir/environment.rb +9 -0
- data/lib/asir/main.rb +54 -22
- data/lib/asir/transport/conduit.rb +10 -1
- data/lib/asir/version.rb +1 -1
- metadata +5 -5
data/ChangeLog
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
2012-03-12 Kurt A. Stephens <ks.github@kurtstephens.com>
|
2
|
+
|
3
|
+
* v1.2.5: New Version: bin/asir.
|
4
|
+
* Do not log error if pid_file does not exist.
|
5
|
+
* Handle fork_process= option.
|
6
|
+
* export ASIR_WORKER=instance:wid for asir start KIND worker.
|
7
|
+
* export ASIR_CONDUIT=1 for asir start KIND conduit.
|
8
|
+
* Remove pid_file if process is not running after asir stop.
|
9
|
+
|
10
|
+
2012-02-01 Kurt A. Stephens <ks.github@kurtstephens.com>
|
11
|
+
|
12
|
+
* v1.2.4: New Version: Bug fixes.
|
13
|
+
* Handle STDIO properly in potentially daemonized processes.
|
14
|
+
|
1
15
|
2013-01-16 Kurt A. Stephens <ks.github@kurtstephens.com>
|
2
16
|
|
3
17
|
* v1.2.3: New Version: Bug fixes.
|
@@ -10,12 +10,14 @@ when :configure
|
|
10
10
|
when :environment
|
11
11
|
require 'rubygems'
|
12
12
|
|
13
|
+
$:.unshift File.expand_path('../..', __FILE__)
|
14
|
+
$:.unshift File.expand_path('../../../lib', __FILE__)
|
15
|
+
|
13
16
|
require 'asir'
|
14
17
|
require 'asir/transport/file'
|
15
18
|
require 'asir/coder/marshal'
|
16
19
|
require 'asir/coder/yaml'
|
17
20
|
|
18
|
-
$:.unshift File.expand_path('..')
|
19
21
|
require 'example_helper'
|
20
22
|
require 'sample_service'
|
21
23
|
require 'unsafe_service'
|
data/lib/asir/environment.rb
CHANGED
@@ -5,6 +5,7 @@ module ASIR; class Environment
|
|
5
5
|
attr_accessor :verb, :adjective, :object, :identifier
|
6
6
|
attr_accessor :config_rb, :config
|
7
7
|
attr_accessor :log_dir, :log_file, :pid_dir
|
8
|
+
attr_accessor :fork_process
|
8
9
|
attr_accessor :options
|
9
10
|
attr_accessor :verbose
|
10
11
|
|
@@ -30,6 +31,14 @@ module ASIR; class Environment
|
|
30
31
|
'/tmp'
|
31
32
|
end
|
32
33
|
|
34
|
+
def fork_process
|
35
|
+
case @fork_process
|
36
|
+
when nil, String, Integer
|
37
|
+
@fork_process = (@fork_process || ENV['ASIR_FORK_PROCESS'] || '1').to_i > 0
|
38
|
+
end
|
39
|
+
@fork_process
|
40
|
+
end
|
41
|
+
|
33
42
|
def find_writable_directory kind, *list
|
34
43
|
list.
|
35
44
|
reject { | p | ! p }.
|
data/lib/asir/main.rb
CHANGED
@@ -9,7 +9,7 @@ class Main
|
|
9
9
|
[ :verb, :adjective, :object, :identifier,
|
10
10
|
:config_rb,
|
11
11
|
:verbose,
|
12
|
-
:options,
|
12
|
+
:options, :fork_process,
|
13
13
|
:log_dir, :log_file,
|
14
14
|
:pid_dir, :pid_file,
|
15
15
|
].
|
@@ -113,16 +113,18 @@ class Main
|
|
113
113
|
when /^status_([^_]+)_([^_]+)!$/
|
114
114
|
pid = server_pid
|
115
115
|
puts "#{log_str} pid #{pid}"
|
116
|
-
system("ps -fw -p #{pid}")
|
116
|
+
system("ps -fw -p #{pid}") if pid
|
117
117
|
when /^log_([^_]+)_([^_]+)!$/
|
118
118
|
puts log_file
|
119
119
|
when /^taillog_([^_]+)_([^_]+)!$/
|
120
120
|
exec "tail -f #{log_file.inspect}"
|
121
121
|
when /^pid_([^_]+)_([^_]+)!$/
|
122
|
-
pid =
|
122
|
+
pid = server_pid
|
123
|
+
alive = !! _alive?
|
123
124
|
puts "#{pid_file} #{pid || :NA} #{alive}"
|
124
125
|
when /^alive_([^_]+)_([^_]+)!$/
|
125
|
-
pid =
|
126
|
+
pid = server_pid
|
127
|
+
alive = !! _alive?
|
126
128
|
puts "#{pid_file} #{pid || :NA} #{alive}" if @verbose
|
127
129
|
self.exit_code += 1 unless alive
|
128
130
|
when /^stop_([^_]+)_([^_]+)!$/
|
@@ -147,6 +149,7 @@ OPTIONS:
|
|
147
149
|
pid_dir=dir/ ($ASIR_PID_DIR)
|
148
150
|
log_dir=dir/ ($ASIR_LOG_DIR)
|
149
151
|
verbose=[0-9]
|
152
|
+
fork_process=[01] ($ASIR_FORK_PROCESS)
|
150
153
|
|
151
154
|
VERBS:
|
152
155
|
start
|
@@ -201,6 +204,7 @@ END
|
|
201
204
|
config!(:environment)
|
202
205
|
self.transport = config!(:transport)
|
203
206
|
fork_server! do
|
207
|
+
ENV['ASIR_CONDUIT'] = '1'
|
204
208
|
transport.start_conduit! :fork => false
|
205
209
|
end
|
206
210
|
end
|
@@ -228,29 +232,51 @@ END
|
|
228
232
|
end
|
229
233
|
|
230
234
|
def fork_server! cmd = nil, &blk
|
231
|
-
|
235
|
+
fork_process! do
|
232
236
|
run_server! cmd, &blk
|
233
237
|
end
|
234
|
-
log "forked pid #{pid}"
|
235
|
-
Process.detach(pid) # Forks a Thread? We are gonna exit anyway.
|
236
|
-
File.open(pid_file, "w+") { | o | o.puts pid }
|
237
|
-
File.chmod(0666, pid_file) rescue nil
|
238
238
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
239
|
+
self
|
240
|
+
end
|
241
|
+
|
242
|
+
def fork_process! &blk
|
243
|
+
if fork_process
|
244
|
+
pid = Process.fork &blk
|
245
|
+
log "forked pid #{pid}"
|
246
|
+
Process.detach(pid) # Forks a Thread? We are gonna exit anyway.
|
247
|
+
write_pid_file! pid
|
248
|
+
|
249
|
+
# Wait and check if process still exists.
|
250
|
+
sleep 3
|
251
|
+
unless process_running? pid
|
252
|
+
raise "Server process #{pid} died to soon?"
|
253
|
+
end
|
254
|
+
else
|
255
|
+
pid = $$
|
256
|
+
log "running pid #{pid}"
|
257
|
+
write_pid_file! pid
|
258
|
+
yield
|
243
259
|
end
|
260
|
+
pid
|
261
|
+
end
|
244
262
|
|
245
|
-
|
263
|
+
def write_pid_file! pid
|
264
|
+
File.open(pid_file, "w+") { | o | o.puts pid }
|
265
|
+
File.chmod(0666, pid_file) rescue nil
|
246
266
|
end
|
247
267
|
|
248
268
|
def run_server! cmd = nil
|
269
|
+
nf = File.open("/dev/null")
|
270
|
+
nf.sync = true
|
271
|
+
STDIN.reopen(nf)
|
272
|
+
STDIN.sync = true
|
273
|
+
$stdin.reopen(nf) if $stdin.object_id != STDIN.object_id
|
274
|
+
$stdin.sync = true
|
275
|
+
|
249
276
|
lf = File.open(log_file, "a+")
|
250
277
|
lf.sync = true
|
251
278
|
File.chmod(0666, log_file) rescue nil
|
252
|
-
|
253
|
-
STDIN.close rescue nil
|
279
|
+
|
254
280
|
STDOUT.reopen(lf)
|
255
281
|
STDOUT.sync = true
|
256
282
|
$stdout.reopen(lf) if $stdout.object_id != STDOUT.object_id
|
@@ -259,6 +285,7 @@ END
|
|
259
285
|
STDERR.sync = true
|
260
286
|
$stderr.reopen(lf) if $stderr.object_id != STDERR.object_id
|
261
287
|
$stderr.sync = true
|
288
|
+
|
262
289
|
# Process.daemon rescue nil # Ruby 1.9.x only.
|
263
290
|
lf.puts "#{log_str} starting pid #{$$}"
|
264
291
|
begin
|
@@ -282,7 +309,10 @@ END
|
|
282
309
|
def kill_server!
|
283
310
|
log "#{log_str} kill"
|
284
311
|
pid = server_pid
|
285
|
-
stop_pid! pid
|
312
|
+
case stop_pid! pid
|
313
|
+
when :not_running
|
314
|
+
File.unlink(pid_file) rescue nil
|
315
|
+
end
|
286
316
|
rescue ::Exception => exc
|
287
317
|
log "#{log_str} ERROR\n#{exc.inspect}\n #{exc.backtrace * "\n "}", :stderr
|
288
318
|
raise
|
@@ -290,7 +320,7 @@ END
|
|
290
320
|
|
291
321
|
def log msg, to_stderr = false
|
292
322
|
if to_stderr
|
293
|
-
$stderr.puts "#{log_str_no_time} #{msg}"
|
323
|
+
$stderr.puts "#{log_str_no_time} #{msg}" rescue nil
|
294
324
|
end
|
295
325
|
File.open(log_file, "a+") do | log |
|
296
326
|
log.puts "#{log_str} #{msg}"
|
@@ -298,8 +328,8 @@ END
|
|
298
328
|
end
|
299
329
|
|
300
330
|
def server_pid
|
301
|
-
|
302
|
-
|
331
|
+
File.exist?(pid_file) &&
|
332
|
+
File.read(pid_file).chomp!.to_i
|
303
333
|
end
|
304
334
|
|
305
335
|
def _create_transport default_class
|
@@ -318,7 +348,6 @@ END
|
|
318
348
|
|
319
349
|
def _run_workers!
|
320
350
|
$0 = "#{progname} #{adjective} #{object} #{identifier}"
|
321
|
-
|
322
351
|
worker_id = 0
|
323
352
|
transport.prepare_server!
|
324
353
|
worker_processes = transport[:worker_processes] || 1
|
@@ -332,13 +361,14 @@ END
|
|
332
361
|
log "forked #{wid} pid #{pid}"
|
333
362
|
end
|
334
363
|
|
335
|
-
_run_transport_server!
|
364
|
+
_run_transport_server! 0
|
336
365
|
ensure
|
337
366
|
log "worker 0 stopped"
|
338
367
|
_stop_workers!
|
339
368
|
end
|
340
369
|
|
341
370
|
def _run_transport_server! wid = 0
|
371
|
+
ENV['ASIR_WORKER'] = "#{identifier}:#{wid}"
|
342
372
|
log "running transport worker #{transport.class} #{wid}"
|
343
373
|
config!(:start)
|
344
374
|
$0 += " #{wid} #{transport.uri rescue nil}"
|
@@ -380,9 +410,11 @@ END
|
|
380
410
|
end
|
381
411
|
if process_running? pid
|
382
412
|
log "cant-stop pid #{pid}", :stderr
|
413
|
+
:cant_stop
|
383
414
|
end
|
384
415
|
else
|
385
416
|
log "not-running? pid #{pid}", :stderr
|
417
|
+
:not_running
|
386
418
|
end
|
387
419
|
end
|
388
420
|
|
@@ -15,7 +15,8 @@ module Asir
|
|
15
15
|
raise "already running #{@conduit_pid} #{@conduit_cmd}" if @conduit_pid
|
16
16
|
if in_fork
|
17
17
|
@conduit_pid = ::Process.fork do
|
18
|
-
|
18
|
+
_log { "start_conduit! #{self} starting pid=#{$$.inspect}" } if @verbose >= 2
|
19
|
+
_close_stdio!
|
19
20
|
_start_conduit!
|
20
21
|
raise "Could not exec"
|
21
22
|
end
|
@@ -24,11 +25,19 @@ module Asir
|
|
24
25
|
::File.open(pid_file, "w") { | fh | fh.puts @conduit_pid }
|
25
26
|
end
|
26
27
|
else
|
28
|
+
_close_stdio!
|
27
29
|
_start_conduit!
|
28
30
|
end
|
29
31
|
self
|
30
32
|
end
|
31
33
|
|
34
|
+
def _close_stdio!
|
35
|
+
n = ::File.open("/dev/null", "w+")
|
36
|
+
[ STDIN, STDOUT, STDERR, $stdin, $stdout, $stderr ].each do | io |
|
37
|
+
io.reopen(n) rescue nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
32
41
|
def conduit_pid
|
33
42
|
if ! @conduit_pid and pid_file = (@conduit_options || EMPTY_HASH)[:pid_file]
|
34
43
|
@conduit_pid = (::File.read(pid_file).to_i rescue nil)
|
data/lib/asir/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asir
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: uuid
|
@@ -270,7 +270,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
270
270
|
version: '0'
|
271
271
|
segments:
|
272
272
|
- 0
|
273
|
-
hash:
|
273
|
+
hash: 1538140158003957969
|
274
274
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
275
275
|
none: false
|
276
276
|
requirements:
|
@@ -279,10 +279,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
279
279
|
version: '0'
|
280
280
|
segments:
|
281
281
|
- 0
|
282
|
-
hash:
|
282
|
+
hash: 1538140158003957969
|
283
283
|
requirements: []
|
284
284
|
rubyforge_project:
|
285
|
-
rubygems_version: 1.8.
|
285
|
+
rubygems_version: 1.8.25
|
286
286
|
signing_key:
|
287
287
|
specification_version: 3
|
288
288
|
summary: Abstracting Services in Ruby
|