batchbase 0.0.2 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +0 -1
- data/batchbase.gemspec +2 -2
- data/example/sample2.rb +19 -2
- data/example/sample3.rb +2 -1
- data/lib/batchbase/core.rb +58 -20
- data/lib/batchbase/version.rb +1 -1
- data/test/batch_by_hand.rb +30 -0
- data/test/batch_too_long.rb +2 -1
- data/test/by_hand.rb +2 -2
- data/test/pg_for_test.rb +29 -0
- data/test/test.rb +121 -22
- data/test/test_helper.rb +2 -0
- metadata +6 -2
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/batchbase.gemspec
CHANGED
@@ -12,8 +12,8 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.description = %q{oreore batch base class}
|
13
13
|
s.rubyforge_project = "batchbase"
|
14
14
|
|
15
|
-
s.add_dependency "sys-proctable","0.9.1"
|
16
|
-
s.add_dependency "kanamei_log_formatter","0.0.1"
|
15
|
+
s.add_dependency "sys-proctable",["0.9.1"]
|
16
|
+
s.add_dependency "kanamei_log_formatter",["0.0.1"]
|
17
17
|
|
18
18
|
s.files = `git ls-files`.split("\n")
|
19
19
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/example/sample2.rb
CHANGED
@@ -3,19 +3,30 @@ require 'batchbase'
|
|
3
3
|
|
4
4
|
# usage type 2
|
5
5
|
|
6
|
+
DEFAULT_TEXT = 'without test'
|
7
|
+
DEFAULT_TEXT_TEST = 'test'
|
8
|
+
|
6
9
|
class Batch
|
7
10
|
include Batchbase::Core
|
8
11
|
|
9
|
-
def
|
12
|
+
def initialize
|
13
|
+
# 初期値設定
|
14
|
+
env_defaults = {:favorite_number=>1}
|
15
|
+
# オプションパーサーの設定追加
|
10
16
|
opts = self.option_parser
|
11
17
|
opts.on("-f", "--favorite_number=value",
|
12
18
|
Integer,"favo"
|
13
19
|
) do |v|
|
14
20
|
env[:favorite_number] = v
|
15
21
|
end
|
22
|
+
# ここでオプションをパースしておく
|
23
|
+
parse_options(env_defaults)
|
24
|
+
end
|
16
25
|
|
26
|
+
def proceed(text)
|
17
27
|
execute do
|
18
28
|
logger.info env.inspect
|
29
|
+
logger.info text
|
19
30
|
if env[:favorite_number]
|
20
31
|
logger.info env[:favorite_number].to_s
|
21
32
|
else
|
@@ -27,4 +38,10 @@ class Batch
|
|
27
38
|
end
|
28
39
|
|
29
40
|
b = Batch.new
|
30
|
-
b.
|
41
|
+
case b.env[:environment]
|
42
|
+
when 'test'
|
43
|
+
b.proceed(DEFAULT_TEXT_TEST)
|
44
|
+
else
|
45
|
+
b.proceed(DEFAULT_TEXT)
|
46
|
+
end
|
47
|
+
|
data/example/sample3.rb
CHANGED
data/lib/batchbase/core.rb
CHANGED
@@ -11,10 +11,11 @@ module Batchbase
|
|
11
11
|
SIGNALS = [ :QUIT, :INT, :TERM, :USR1, :USR2, :HUP ]
|
12
12
|
#SIGNALS = [ :QUIT, :INT, :TERM ]
|
13
13
|
|
14
|
-
DOUBLE_PROCESS_CHECK__OK
|
15
|
-
DOUBLE_PROCESS_CHECK__AUTO_RECOVERD
|
16
|
-
DOUBLE_PROCESS_CHECK__NG
|
17
|
-
DOUBLE_PROCESS_CHECK__STILL_RUNNING
|
14
|
+
DOUBLE_PROCESS_CHECK__OK = 1
|
15
|
+
DOUBLE_PROCESS_CHECK__AUTO_RECOVERD = 2
|
16
|
+
DOUBLE_PROCESS_CHECK__NG = 0
|
17
|
+
DOUBLE_PROCESS_CHECK__STILL_RUNNING = -1
|
18
|
+
DOUBLE_PROCESS_CHECK__SAME_PROCESS_NAME = 3
|
18
19
|
|
19
20
|
def option_parser
|
20
21
|
@__option_parser ||= OptionParser.new
|
@@ -71,7 +72,7 @@ module Batchbase
|
|
71
72
|
#
|
72
73
|
# 内部的には
|
73
74
|
# init
|
74
|
-
#
|
75
|
+
# parse_options_inner
|
75
76
|
# execute_inner
|
76
77
|
# release
|
77
78
|
# の順にコールしてます
|
@@ -82,22 +83,25 @@ module Batchbase
|
|
82
83
|
# :auto_recover 初期値 false
|
83
84
|
#
|
84
85
|
def execute(options={},&process)
|
86
|
+
result = nil
|
85
87
|
begin
|
86
88
|
init
|
89
|
+
parse_options_inner(options,ARGV)
|
87
90
|
logger.info "start script(#{pg_path})"
|
88
91
|
logger.debug "caller=#{caller}"
|
89
|
-
parse_options(options,ARGV)
|
90
92
|
result = double_process_check_and_create_pid_file
|
91
93
|
case result
|
92
94
|
when DOUBLE_PROCESS_CHECK__OK,DOUBLE_PROCESS_CHECK__AUTO_RECOVERD
|
93
95
|
if result == DOUBLE_PROCESS_CHECK__AUTO_RECOVERD
|
94
96
|
logger.warn "lock file still exists[pid=#{env[:old_pid_from_pid_file]}:file=#{pid_file}],but process does not found.Auto_recover enabled.so process continues"
|
95
97
|
end
|
96
|
-
execute_inner(&process)
|
98
|
+
result = execute_inner(&process)
|
97
99
|
when DOUBLE_PROCESS_CHECK__NG
|
98
100
|
logger.error "lock file still exists[pid=#{env[:old_pid_from_pid_file]}:file=#{pid_file}],but process does not found.Auto_recover disabled.so process can not continue"
|
99
101
|
when DOUBLE_PROCESS_CHECK__STILL_RUNNING
|
100
102
|
logger.warn "pid:#{env[:old_pid_from_pid_file]} still running"
|
103
|
+
when DOUBLE_PROCESS_CHECK__SAME_PROCESS_NAME
|
104
|
+
logger.warn "process_name:#{env[:process_name]} still exists"
|
101
105
|
else
|
102
106
|
raise 'must not happen'
|
103
107
|
end
|
@@ -107,6 +111,7 @@ module Batchbase
|
|
107
111
|
release
|
108
112
|
logger.info "finish script (%1.3fsec)" % (Time.now - @__script_started_at)
|
109
113
|
end
|
114
|
+
result
|
110
115
|
end
|
111
116
|
|
112
117
|
module ClassMethods
|
@@ -116,6 +121,9 @@ module Batchbase
|
|
116
121
|
process = Sys::ProcTable.ps(pid)
|
117
122
|
process != nil && process.state == 'run'
|
118
123
|
end
|
124
|
+
|
125
|
+
def env
|
126
|
+
end
|
119
127
|
end
|
120
128
|
|
121
129
|
def self.included(mod)
|
@@ -140,12 +148,17 @@ module Batchbase
|
|
140
148
|
@__signal_observers << method_name
|
141
149
|
end
|
142
150
|
|
151
|
+
def parse_options(options)
|
152
|
+
parse_options_inner(options,ARGV)
|
153
|
+
end
|
154
|
+
|
143
155
|
private
|
144
156
|
|
145
157
|
def init
|
146
158
|
SIGNALS.each { |sig| trap(sig){r_signal(sig)} }
|
147
159
|
@__script_started_at = Time.now
|
148
|
-
raise 'already inited' if @__init
|
160
|
+
#raise 'already inited' if @__init
|
161
|
+
return if @__init
|
149
162
|
@__init = true
|
150
163
|
env[:pid] = $$
|
151
164
|
if File.expand_path(caller[0]) =~ /(.*):\d*:in `.*?'\z/
|
@@ -155,21 +168,23 @@ module Batchbase
|
|
155
168
|
end
|
156
169
|
end
|
157
170
|
|
158
|
-
def
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
171
|
+
def parse_options_inner(options,argv)
|
172
|
+
init
|
173
|
+
return if @__parse_option
|
174
|
+
@__parse_option = true
|
175
|
+
options[:double_process_check] = true if options[:double_process_check].nil?
|
176
|
+
options[:auto_recover] ||= false
|
177
|
+
options[:environment] ||= 'development'
|
178
|
+
options[:pg_name] ||= File.basename(pg_path)
|
179
|
+
options[:pid_file] ||= "/tmp/.#{env[:pg_name]}.#{Digest::MD5.hexdigest(pg_path)}.pid"
|
180
|
+
options[:daemonize] ||= false
|
181
|
+
options.each do |k,v|
|
182
|
+
env[k] = v
|
183
|
+
end
|
169
184
|
|
170
185
|
opts = option_parser
|
171
186
|
|
172
|
-
opts.on("-e", "--environment
|
187
|
+
opts.on("-e", "--environment name",
|
173
188
|
String,"specifies the environment",
|
174
189
|
"default: development") do |v|
|
175
190
|
env[:environment] = v
|
@@ -179,12 +194,22 @@ module Batchbase
|
|
179
194
|
env[:daemonize] = true
|
180
195
|
end
|
181
196
|
|
197
|
+
opts.on("-p", "--process_name name",
|
198
|
+
String,"specifies the process name(it work with double process check)",
|
199
|
+
"default: nil") do |v|
|
200
|
+
env[:process_name] = v.clone.strip
|
201
|
+
end
|
202
|
+
|
182
203
|
opts.on("-h","--help","show this help message.") { $stderr.puts opts; exit }
|
183
204
|
|
184
205
|
opts.on("--lockfile LOCK_FILE_PATH","set lock file path") do |v|
|
185
206
|
double_process_check = true
|
186
207
|
env[:pid_file] = v
|
187
208
|
end
|
209
|
+
opts.on("--log LOG_FILE_PATH","set log file path") do |v|
|
210
|
+
env[:log] = v
|
211
|
+
create_logger(v)
|
212
|
+
end
|
188
213
|
opts.on("--double_process_check_off","disable double process check") do |v|
|
189
214
|
env[:double_process_check] = false
|
190
215
|
end
|
@@ -194,6 +219,10 @@ module Batchbase
|
|
194
219
|
|
195
220
|
opts.parse!(argv)
|
196
221
|
|
222
|
+
if env[:process_name]
|
223
|
+
$0 = env[:process_name]
|
224
|
+
end
|
225
|
+
|
197
226
|
if env[:auto_recover] == true
|
198
227
|
env[:double_process_check] = true
|
199
228
|
end
|
@@ -220,6 +249,15 @@ module Batchbase
|
|
220
249
|
end
|
221
250
|
end
|
222
251
|
end
|
252
|
+
|
253
|
+
if env[:process_name]
|
254
|
+
Sys::ProcTable.ps do |other_process|
|
255
|
+
if other_process.cmdline.strip == env[:process_name] && $$ != other_process.pid
|
256
|
+
env[:double_process_check_problem] = true
|
257
|
+
return DOUBLE_PROCESS_CHECK__SAME_PROCESS_NAME
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
223
261
|
File.open(pid_file, "w"){|f|f.write $$}
|
224
262
|
env[:double_process_check_worked] = double_process_check_worked
|
225
263
|
end
|
data/lib/batchbase/version.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
class BatchByHand
|
2
|
+
include Batchbase::Core
|
3
|
+
skip_logging
|
4
|
+
|
5
|
+
TEST_FILE = '/tmp/.batchbase_batch_by_hand.txt'
|
6
|
+
|
7
|
+
def proceed(opt={})
|
8
|
+
@shutdown = false
|
9
|
+
set_signal_observer(:receive_signal)
|
10
|
+
|
11
|
+
execute(opt) do
|
12
|
+
sleep 20
|
13
|
+
File.write(TEST_FILE,$$)
|
14
|
+
if opt[:daemonize]
|
15
|
+
loop do
|
16
|
+
sleep 1
|
17
|
+
if @shutdown
|
18
|
+
#puts "shutdown by #{@shutdown}"
|
19
|
+
break
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
11
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def receive_signal(sig)
|
28
|
+
@shutdown = sig
|
29
|
+
end
|
30
|
+
end
|
data/test/batch_too_long.rb
CHANGED
@@ -9,7 +9,7 @@ class BatchTooLong
|
|
9
9
|
set_signal_observer(:receive_signal)
|
10
10
|
end
|
11
11
|
end
|
12
|
-
|
12
|
+
#@shutdown = false
|
13
13
|
execute(opt) do
|
14
14
|
100.times do
|
15
15
|
sleep 1
|
@@ -19,6 +19,7 @@ class BatchTooLong
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def receive_signal(sig)
|
22
|
+
#File.write('/tmp/.batchbase.batch_too_long.receive_signal.dat',"#{sig}")
|
22
23
|
@shutdown = true
|
23
24
|
end
|
24
25
|
|
data/test/by_hand.rb
CHANGED
data/test/pg_for_test.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
$: << File.dirname(__FILE__)
|
4
|
+
require 'test_helper'
|
5
|
+
require 'batch'
|
6
|
+
require 'Fileutils'
|
7
|
+
|
8
|
+
include Batchbase::Core
|
9
|
+
|
10
|
+
create_logger('/dev/null')
|
11
|
+
#create_logger(STDOUT)
|
12
|
+
|
13
|
+
def receive_signal(sig)
|
14
|
+
logger.info("receive signal #{sig}")
|
15
|
+
@shutdown = true
|
16
|
+
end
|
17
|
+
|
18
|
+
result = execute do
|
19
|
+
set_signal_observer(:receive_signal)
|
20
|
+
4.times do
|
21
|
+
logger.info('logged by pg_for_test')
|
22
|
+
sleep 1
|
23
|
+
break if @shutdown
|
24
|
+
end
|
25
|
+
999999
|
26
|
+
end
|
27
|
+
|
28
|
+
File.write(FILE_PG_TEST,result.to_s)
|
29
|
+
|
data/test/test.rb
CHANGED
@@ -7,7 +7,6 @@ require 'Fileutils'
|
|
7
7
|
|
8
8
|
#require 'bundler'
|
9
9
|
#Bundler.require
|
10
|
-
|
11
10
|
#require 'sys/proctable'
|
12
11
|
|
13
12
|
require 'batch'
|
@@ -17,12 +16,16 @@ class TestBatchbase < Test::Unit::TestCase
|
|
17
16
|
|
18
17
|
PID_FILE_FORCE = '/tmp/.batchbase_test.pid'
|
19
18
|
PID_FILE_DAEMONIZE_TEST = '/tmp/.batchbase_daemonize_test.pid'
|
19
|
+
LOG_FILE = '/tmp/batchbase_test.log'
|
20
|
+
PROCESS_NAME = 'batchbase_test_hogehoge'
|
20
21
|
|
21
22
|
def setup
|
22
23
|
delete_file(pid_file)
|
23
24
|
delete_file(PID_FILE_FORCE)
|
24
25
|
delete_file(PID_FILE_DAEMONIZE_TEST)
|
25
|
-
delete_file(Batch::TEST_FILE)
|
26
|
+
delete_file(Batch::TEST_FILE) # HACKME したとまとめる、、、
|
27
|
+
delete_file(FILE_PG_TEST)
|
28
|
+
delete_file(LOG_FILE)
|
26
29
|
end
|
27
30
|
|
28
31
|
def new_batch_instance
|
@@ -38,14 +41,14 @@ class TestBatchbase < Test::Unit::TestCase
|
|
38
41
|
def pid_file
|
39
42
|
b = new_batch_instance
|
40
43
|
b.send(:init)
|
41
|
-
b.send(:
|
44
|
+
b.send(:parse_options_inner,{},[])
|
42
45
|
b.env[:pid_file]
|
43
46
|
end
|
44
47
|
|
45
48
|
def test_pid_file
|
46
49
|
b = new_batch_instance
|
47
50
|
b.send(:init)
|
48
|
-
b.send(:
|
51
|
+
b.send(:parse_options_inner,{},[])
|
49
52
|
b.send(:double_process_check_and_create_pid_file)
|
50
53
|
assert_equal true,File.exists?(b.env[:pid_file])
|
51
54
|
b.send(:release)
|
@@ -56,7 +59,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
56
59
|
FileUtils.touch(pid_file) # すでにpid_fileがあるとして
|
57
60
|
b = new_batch_instance
|
58
61
|
b.send(:init)
|
59
|
-
b.send(:
|
62
|
+
b.send(:parse_options_inner,{},[])
|
60
63
|
result = b.send(:double_process_check_and_create_pid_file)
|
61
64
|
assert_equal Batchbase::Core::DOUBLE_PROCESS_CHECK__NG,result
|
62
65
|
File.delete(pid_file)
|
@@ -66,7 +69,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
66
69
|
FileUtils.touch(pid_file) # すでにpid_fileがあるとして
|
67
70
|
b = new_batch_instance
|
68
71
|
b.send(:init)
|
69
|
-
b.send(:
|
72
|
+
b.send(:parse_options_inner,{:double_process_check=>false},[])
|
70
73
|
result = b.send(:double_process_check_and_create_pid_file)
|
71
74
|
assert_equal Batchbase::Core::DOUBLE_PROCESS_CHECK__OK,result
|
72
75
|
File.delete(pid_file)
|
@@ -76,7 +79,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
76
79
|
FileUtils.touch(pid_file) # すでにpid_fileがあるとして
|
77
80
|
b = new_batch_instance
|
78
81
|
b.send(:init)
|
79
|
-
b.send(:
|
82
|
+
b.send(:parse_options_inner,{:auto_recover=>true},[])
|
80
83
|
result = b.send(:double_process_check_and_create_pid_file)
|
81
84
|
assert_equal Batchbase::Core::DOUBLE_PROCESS_CHECK__AUTO_RECOVER,result
|
82
85
|
assert_equal true,File.exists?(b.env[:pid_file]) # pid_fileは存在していないとだめ
|
@@ -86,7 +89,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
86
89
|
def test_auto_recover
|
87
90
|
b = new_batch_instance
|
88
91
|
b.send(:init)
|
89
|
-
b.send(:
|
92
|
+
b.send(:parse_options_inner,{},[:auto_recover=>true])
|
90
93
|
b.send(:double_process_check_and_create_pid_file)
|
91
94
|
assert_equal true,File.exists?(b.env[:pid_file])
|
92
95
|
b.send(:release)
|
@@ -98,7 +101,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
98
101
|
b = new_batch_instance
|
99
102
|
b.send(:init)
|
100
103
|
argv = []
|
101
|
-
b.send(:
|
104
|
+
b.send(:parse_options_inner,{},argv)
|
102
105
|
assert_equal b.env[:environment],'development'
|
103
106
|
assert_equal b.env[:double_process_check],true
|
104
107
|
assert_equal b.env[:auto_recover],false
|
@@ -107,7 +110,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
107
110
|
b = new_batch_instance
|
108
111
|
b.send(:init)
|
109
112
|
argv = ['-e','test','--auto_recover']
|
110
|
-
b.send(:
|
113
|
+
b.send(:parse_options_inner,{},argv)
|
111
114
|
assert_equal b.env[:environment],'test'
|
112
115
|
assert_equal b.env[:double_process_check],true
|
113
116
|
assert_equal b.env[:auto_recover],true
|
@@ -115,14 +118,14 @@ class TestBatchbase < Test::Unit::TestCase
|
|
115
118
|
b = new_batch_instance
|
116
119
|
b.send(:init)
|
117
120
|
argv = ['--double_process_check_off']
|
118
|
-
b.send(:
|
121
|
+
b.send(:parse_options_inner,{},argv)
|
119
122
|
assert_equal b.env[:double_process_check],false
|
120
123
|
|
121
124
|
# オートリカバリー入れたらダブルプロセスチェックは強制ON
|
122
125
|
b = new_batch_instance
|
123
126
|
b.send(:init)
|
124
127
|
argv = ['-e','test','--auto_recover','double_process_check_off']
|
125
|
-
b.send(:
|
128
|
+
b.send(:parse_options_inner,{},argv)
|
126
129
|
assert_equal b.env[:environment],'test'
|
127
130
|
assert_equal b.env[:double_process_check],true
|
128
131
|
assert_equal b.env[:auto_recover],true
|
@@ -130,8 +133,15 @@ class TestBatchbase < Test::Unit::TestCase
|
|
130
133
|
b = new_batch_instance
|
131
134
|
b.send(:init)
|
132
135
|
argv = ['--lockfile','/tmp/.lockfile_test']
|
133
|
-
b.send(:
|
136
|
+
b.send(:parse_options_inner,{},argv)
|
137
|
+
assert_equal b.env[:pid_file],'/tmp/.lockfile_test'
|
138
|
+
|
139
|
+
b = new_batch_instance
|
140
|
+
b.send(:init)
|
141
|
+
argv = ['--lockfile','/tmp/.lockfile_test']
|
142
|
+
b.send(:parse_options_inner,{:jojo=>123},argv)
|
134
143
|
assert_equal b.env[:pid_file],'/tmp/.lockfile_test'
|
144
|
+
assert_equal b.env[:jojo],123
|
135
145
|
end
|
136
146
|
|
137
147
|
def test_options
|
@@ -140,7 +150,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
140
150
|
b.send(:init)
|
141
151
|
argv = []
|
142
152
|
options = {:double_process_check=>false,:environment=>'test'}
|
143
|
-
b.send(:
|
153
|
+
b.send(:parse_options_inner,options,argv)
|
144
154
|
assert_equal b.env[:environment],'test'
|
145
155
|
assert_equal b.env[:double_process_check],false
|
146
156
|
assert_equal b.env[:auto_recover],false
|
@@ -151,7 +161,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
151
161
|
b.send(:init)
|
152
162
|
argv = []
|
153
163
|
options = {:double_process_check=>false,:auto_recover=>true}
|
154
|
-
b.send(:
|
164
|
+
b.send(:parse_options_inner,options,argv)
|
155
165
|
assert_equal b.env[:double_process_check],true
|
156
166
|
assert_equal b.env[:auto_recover],true
|
157
167
|
|
@@ -159,7 +169,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
159
169
|
b.send(:init)
|
160
170
|
argv = []
|
161
171
|
options = {:pid_file=>'/tmp/.lock_test'}
|
162
|
-
b.send(:
|
172
|
+
b.send(:parse_options_inner,options,argv)
|
163
173
|
assert_equal b.env[:pid_file],'/tmp/.lock_test'
|
164
174
|
|
165
175
|
# ミックスならARGVの指定の方を優先
|
@@ -167,7 +177,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
167
177
|
b.send(:init)
|
168
178
|
argv = ['--lockfile','/tmp/.lllock','--auto_recover']
|
169
179
|
options = {:pid_file=>'/tmp/.lock_test',:auto_recover=>false,:double_process_check=>false}
|
170
|
-
b.send(:
|
180
|
+
b.send(:parse_options_inner,options,argv)
|
171
181
|
assert_equal b.env[:double_process_check],true
|
172
182
|
assert_equal b.env[:auto_recover],true
|
173
183
|
assert_equal b.env[:pid_file],'/tmp/.lllock'
|
@@ -184,7 +194,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
184
194
|
|
185
195
|
b.send(:init)
|
186
196
|
argv = ['--favorite_number','11']
|
187
|
-
b.send(:
|
197
|
+
b.send(:parse_options_inner,{},argv)
|
188
198
|
assert_equal 'development',b.env[:environment]
|
189
199
|
assert_equal true,b.env[:double_process_check]
|
190
200
|
assert_equal false,b.env[:auto_recover]
|
@@ -232,9 +242,9 @@ class TestBatchbase < Test::Unit::TestCase
|
|
232
242
|
b.skip_logging
|
233
243
|
b.proceed(:pid_file=>PID_FILE_FORCE)
|
234
244
|
end
|
235
|
-
sleep
|
236
|
-
pid_by_file = File.read(PID_FILE_FORCE).chomp.to_i
|
245
|
+
sleep 2
|
237
246
|
assert_equal true,Batch.is_there_process(pid)
|
247
|
+
pid_by_file = File.read(PID_FILE_FORCE).chomp.to_i
|
238
248
|
assert_equal pid,pid_by_file
|
239
249
|
# シグナルを送る
|
240
250
|
# pid_fileを消して終了するか?
|
@@ -275,7 +285,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
275
285
|
b.skip_logging
|
276
286
|
b.proceed(:pid_file=>PID_FILE_FORCE,:signal_cancel=>true)
|
277
287
|
end
|
278
|
-
sleep
|
288
|
+
sleep 2
|
279
289
|
pid_by_file = File.read(PID_FILE_FORCE).chomp.to_i
|
280
290
|
assert_equal true,Batch.is_there_process(pid)
|
281
291
|
assert_equal pid,pid_by_file
|
@@ -302,7 +312,7 @@ class TestBatchbase < Test::Unit::TestCase
|
|
302
312
|
|
303
313
|
b2 = new_batch_instance
|
304
314
|
b2.send(:init)
|
305
|
-
b2.send(:
|
315
|
+
b2.send(:parse_options_inner,{:pid_file=>PID_FILE_FORCE},[])
|
306
316
|
result = b2.send(:double_process_check_and_create_pid_file)
|
307
317
|
assert_equal Batch::DOUBLE_PROCESS_CHECK__STILL_RUNNING,result
|
308
318
|
#b2.send(:execute_inner)
|
@@ -312,6 +322,95 @@ class TestBatchbase < Test::Unit::TestCase
|
|
312
322
|
sleep 2
|
313
323
|
end
|
314
324
|
|
325
|
+
# pidファイルを手で消したら所詮二重起動チェックから漏れるよね
|
326
|
+
def test_can_break_double_process_check
|
327
|
+
pid = fork do
|
328
|
+
b = new_batch_instance
|
329
|
+
b.proceed(:pid_file=>PID_FILE_FORCE)
|
330
|
+
end
|
331
|
+
|
332
|
+
sleep 0.5
|
333
|
+
|
334
|
+
b2 = new_batch_instance
|
335
|
+
b2.send(:init)
|
336
|
+
b2.send(:parse_options_inner,{:pid_file=>PID_FILE_FORCE},[])
|
337
|
+
result = b2.send(:double_process_check_and_create_pid_file)
|
338
|
+
assert_equal Batch::DOUBLE_PROCESS_CHECK__STILL_RUNNING,result
|
339
|
+
#b2.send(:execute_inner)
|
340
|
+
b2.send(:release)
|
341
|
+
# pid_fileまだは存在していないとだめ
|
342
|
+
assert_equal true,File.exists?(b2.env[:pid_file])
|
343
|
+
|
344
|
+
# しかしファイルを消されるとチェックは通る
|
345
|
+
File.delete(PID_FILE_FORCE)
|
346
|
+
b2 = new_batch_instance
|
347
|
+
b2.send(:init)
|
348
|
+
b2.send(:parse_options_inner,{:pid_file=>PID_FILE_FORCE},[])
|
349
|
+
result = b2.send(:double_process_check_and_create_pid_file)
|
350
|
+
assert_equal Batch::DOUBLE_PROCESS_CHECK__OK,result
|
351
|
+
#b2.send(:execute_inner)
|
352
|
+
b2.send(:release)
|
353
|
+
|
354
|
+
`kill #{pid}`
|
355
|
+
sleep 2
|
356
|
+
delete_file(PID_FILE_FORCE)
|
357
|
+
end
|
358
|
+
|
359
|
+
def test_double_process_check_type_exec
|
360
|
+
system "ruby ./test/pg_for_test.rb --lockfile #{PID_FILE_FORCE} &"
|
361
|
+
sleep 1
|
362
|
+
system "ruby ./test/pg_for_test.rb --lockfile #{PID_FILE_FORCE} &"
|
363
|
+
sleep 1
|
364
|
+
assert_equal Batch::DOUBLE_PROCESS_CHECK__STILL_RUNNING,File.read(FILE_PG_TEST).to_i
|
365
|
+
|
366
|
+
sleep 3
|
367
|
+
end
|
368
|
+
|
369
|
+
def test_can_break_double_process_check_exec
|
370
|
+
system "ruby ./test/pg_for_test.rb --lockfile #{PID_FILE_FORCE} &"
|
371
|
+
sleep 0.5
|
372
|
+
delete_file(PID_FILE_FORCE)
|
373
|
+
sleep 0.5
|
374
|
+
system "ruby ./test/pg_for_test.rb --lockfile #{PID_FILE_FORCE} &"
|
375
|
+
sleep 1
|
376
|
+
assert_equal false,File.exists?(FILE_PG_TEST) # 停止していないってことで
|
377
|
+
sleep 3
|
378
|
+
end
|
379
|
+
|
380
|
+
# process_nameまで指定するとプロセス上に同じ名前があってもうごきません
|
381
|
+
def test_double_process_check_with_process_name
|
382
|
+
cmd = "ruby ./test/pg_for_test.rb --process_name hogehogemorimoribatchbase --lockfile #{PID_FILE_FORCE} &"
|
383
|
+
system cmd
|
384
|
+
sleep 0.7
|
385
|
+
assert_equal false,File.exists?(FILE_PG_TEST)
|
386
|
+
delete_file(PID_FILE_FORCE)
|
387
|
+
sleep 0.5
|
388
|
+
system cmd
|
389
|
+
sleep 1
|
390
|
+
|
391
|
+
assert_equal Batch::DOUBLE_PROCESS_CHECK__SAME_PROCESS_NAME,File.read(FILE_PG_TEST).to_i
|
392
|
+
sleep 3
|
393
|
+
end
|
394
|
+
|
395
|
+
def test_with_log
|
396
|
+
assert_equal false, File.exists?(LOG_FILE)
|
397
|
+
cmd = "ruby ./test/pg_for_test.rb --lockfile #{PID_FILE_FORCE} --log #{LOG_FILE} &"
|
398
|
+
system cmd
|
399
|
+
sleep 1
|
400
|
+
assert_equal true, File.exists?(LOG_FILE)
|
401
|
+
system "kill `cat #{PID_FILE_FORCE}`"
|
402
|
+
sleep 1
|
403
|
+
end
|
404
|
+
|
405
|
+
def test_without_log
|
406
|
+
assert_equal false, File.exists?(LOG_FILE)
|
407
|
+
cmd = "ruby ./test/pg_for_test.rb --lockfile #{PID_FILE_FORCE}&"
|
408
|
+
system cmd
|
409
|
+
sleep 1
|
410
|
+
assert_equal false, File.exists?(LOG_FILE)
|
411
|
+
system "kill `cat #{PID_FILE_FORCE}`"
|
412
|
+
sleep 1
|
413
|
+
end
|
315
414
|
#
|
316
415
|
# HACKME
|
317
416
|
# executeを読んだ際のメッセージ文言等でエラーが出る場合のフック、、、
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: batchbase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
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: 2012-
|
12
|
+
date: 2012-11-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sys-proctable
|
@@ -62,9 +62,11 @@ files:
|
|
62
62
|
- lib/batchbase/version.rb
|
63
63
|
- readme.md
|
64
64
|
- test/batch.rb
|
65
|
+
- test/batch_by_hand.rb
|
65
66
|
- test/batch_too_long.rb
|
66
67
|
- test/by_hand.rb
|
67
68
|
- test/check_logger.rb
|
69
|
+
- test/pg_for_test.rb
|
68
70
|
- test/test.rb
|
69
71
|
- test/test_helper.rb
|
70
72
|
homepage: ''
|
@@ -93,9 +95,11 @@ specification_version: 3
|
|
93
95
|
summary: oreore batch base class
|
94
96
|
test_files:
|
95
97
|
- test/batch.rb
|
98
|
+
- test/batch_by_hand.rb
|
96
99
|
- test/batch_too_long.rb
|
97
100
|
- test/by_hand.rb
|
98
101
|
- test/check_logger.rb
|
102
|
+
- test/pg_for_test.rb
|
99
103
|
- test/test.rb
|
100
104
|
- test/test_helper.rb
|
101
105
|
has_rdoc:
|