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 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