lobster 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lobster (0.2.2)
4
+ lobster (0.2.4)
5
5
  daemons (>= 1.1.4)
6
6
 
7
7
  GEM
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
- [:command, :delay, :user, :directory].each do |opt|
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
- Lobster.logger.error "Job #{@name} Failed with status #{$?}" unless $?.success?
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} and all its children"
56
- kill_tree sig, @pid
57
- end
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
@@ -30,7 +30,7 @@ module Lobster
30
30
  @current_options = nil
31
31
  end
32
32
 
33
- [:command, :delay, :user, :directory].each do |opt|
33
+ Job::OPTIONS.each do |opt|
34
34
  define_method opt do |value|
35
35
  @current_options[opt] = value
36
36
  end
@@ -25,7 +25,7 @@ module Lobster
25
25
 
26
26
  Thread.new do
27
27
  while (line = rerr.gets)
28
- Lobster.logger.error line.chomp
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
@@ -1,3 +1,3 @@
1
1
  module Lobster
2
- VERSION = '0.2.3'
2
+ VERSION = '0.2.4'
3
3
  end
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.3
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-05-09 00:00:00.000000000 Z
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: &77195720 !ruby/object:Gem::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: *77195720
24
+ version_requirements: *73730740
25
25
  description: ''
26
26
  email:
27
27
  - m.brugidou@criteo.com