batchbase 0.0.2 → 0.0.4
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/.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:
|