lobster 0.2.3 → 0.2.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/Gemfile.lock +1 -1
- data/README.md +8 -0
- data/lib/lobster/job.rb +21 -31
- data/lib/lobster/job_list.rb +1 -1
- data/lib/lobster/service.rb +2 -1
- data/lib/lobster/version.rb +1 -1
- metadata +4 -4
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -33,6 +33,14 @@ job "my-job" do
|
|
33
33
|
end
|
34
34
|
~~~~~
|
35
35
|
|
36
|
+
Additional settings:
|
37
|
+
|
38
|
+
- `directory` this is set to `LOBSTER_DIR` by default
|
39
|
+
- `user` the Unix user that will run the job, lobster must have full
|
40
|
+
passwordless sudo access to this user
|
41
|
+
- `max_duration` for monitoring, will log an error if the job has not been
|
42
|
+
successful for `max_duration + delay` minutes
|
43
|
+
|
36
44
|
### Run Lobster
|
37
45
|
|
38
46
|
Two environment variables are used (with defaults):
|
data/lib/lobster/job.rb
CHANGED
@@ -2,6 +2,8 @@ module Lobster
|
|
2
2
|
class Job
|
3
3
|
attr_accessor :next_run
|
4
4
|
|
5
|
+
OPTIONS = [:command, :delay, :max_duration, :user, :directory]
|
6
|
+
|
5
7
|
def initialize(name)
|
6
8
|
@name = name
|
7
9
|
Lobster.logger.info "Job #{name} created."
|
@@ -10,9 +12,10 @@ module Lobster
|
|
10
12
|
|
11
13
|
def reload(options, lobster_dir)
|
12
14
|
options[:delay] ||= 10
|
15
|
+
options[:max_duration] ||= 0
|
13
16
|
options[:directory] ||= lobster_dir
|
14
17
|
|
15
|
-
|
18
|
+
OPTIONS.each do |opt|
|
16
19
|
val = instance_variable_get "@#{opt}"
|
17
20
|
if options[opt] != val
|
18
21
|
Lobster.logger.info "Job #{opt} updated for #{@name}, was \"#{val}\", now \"#{options[opt]}\"" if val
|
@@ -24,12 +27,25 @@ module Lobster
|
|
24
27
|
|
25
28
|
@name ||= "<unnamed_job_#{@command.hash.abs}>"
|
26
29
|
@next_run ||= Time.now + rand(@delay*60)
|
30
|
+
@last_run ||= Time.now
|
31
|
+
end
|
32
|
+
|
33
|
+
def check_last_run
|
34
|
+
if @max_duration > 0 and Time.now - @last_run >= (@max_duration + @delay)*60
|
35
|
+
Lobster.logger.error(
|
36
|
+
"Job #{@name} has not run since #{@last_run}"
|
37
|
+
)
|
38
|
+
end
|
27
39
|
end
|
28
40
|
|
29
41
|
def running?
|
30
42
|
return false if @pid.nil?
|
31
43
|
if Process.wait @pid, Process::WNOHANG
|
32
|
-
|
44
|
+
if $?.success?
|
45
|
+
@last_run = Time.now
|
46
|
+
else
|
47
|
+
Lobster.logger.error "Job #{@name} Failed with status #{$?}"
|
48
|
+
end
|
33
49
|
@pid = nil
|
34
50
|
@next_run = Time.now + @delay*60
|
35
51
|
false
|
@@ -52,35 +68,9 @@ module Lobster
|
|
52
68
|
|
53
69
|
def kill(sig)
|
54
70
|
if @pid
|
55
|
-
Lobster.logger.info "Killing job #{@name} with pid #{@pid}
|
56
|
-
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
private
|
61
|
-
|
62
|
-
def kill_tree(sig, pid)
|
63
|
-
child_parent_processes = `ps -eo pid,ppid | grep #{pid}`
|
64
|
-
child_parent_processes = child_parent_processes.split("\n").map do |child_and_parent|
|
65
|
-
child_and_parent.strip.split(/\s+/).map(&:to_i)
|
66
|
-
end
|
67
|
-
child_parent_processes.each do |child, parent|
|
68
|
-
if parent == pid
|
69
|
-
kill_tree(sig, child)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
Lobster.logger.info "Killing pid #{pid}"
|
74
|
-
if @user
|
75
|
-
`sudo -inu #{@user} -- sh -c "kill -s #{sig} #{pid}"`
|
76
|
-
else
|
77
|
-
begin
|
78
|
-
Process.kill sig, pid
|
79
|
-
rescue Errno::ESRCH
|
80
|
-
# Process already got killed somehow
|
81
|
-
rescue Exception => e
|
82
|
-
Lobster.logger.warn "Process #{pid} exception: #{e}"
|
83
|
-
end
|
71
|
+
Lobster.logger.info "Killing job #{@name} with pid #{@pid}"
|
72
|
+
Process.kill sig, @pid
|
73
|
+
Process.wait @pid
|
84
74
|
end
|
85
75
|
end
|
86
76
|
end
|
data/lib/lobster/job_list.rb
CHANGED
data/lib/lobster/service.rb
CHANGED
@@ -25,7 +25,7 @@ module Lobster
|
|
25
25
|
|
26
26
|
Thread.new do
|
27
27
|
while (line = rerr.gets)
|
28
|
-
Lobster.logger.
|
28
|
+
Lobster.logger.warn line.chomp
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -63,6 +63,7 @@ module Lobster
|
|
63
63
|
reload_schedule
|
64
64
|
|
65
65
|
@job_list.jobs.each_value do |job|
|
66
|
+
job.check_last_run
|
66
67
|
if not job.running? and now >= job.next_run
|
67
68
|
job.run(@wout, @werr)
|
68
69
|
end
|
data/lib/lobster/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lobster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: daemons
|
16
|
-
requirement: &
|
16
|
+
requirement: &73730740 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: 1.1.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *73730740
|
25
25
|
description: ''
|
26
26
|
email:
|
27
27
|
- m.brugidou@criteo.com
|