File: clockworkd

package info (click to toggle)
ruby-clockwork 3.0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 348 kB
  • sloc: ruby: 1,638; makefile: 4
file content (92 lines) | stat: -rwxr-xr-x 3,428 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/usr/bin/env ruby

STDERR.sync = STDOUT.sync = true

require 'clockwork'
require 'optparse'
require 'pathname'

begin
  require 'daemons'
rescue LoadError
  raise "You need to add gem 'daemons' to your Gemfile or Rubygems if you wish to use it."
end

@options = {
  :quiet => false,
  :pid_dir => File.expand_path("./tmp"),
  :log_output => false,
  :monitor => false,
  :file => File.expand_path("./clock.rb")
}

bin_basename = File.basename($0)

opts = OptionParser.new do |opts|
  opts.banner = "Usage: #{bin_basename} -c FILE [options] start|stop|restart|run"
  opts.separator ''
  opts.on_tail('-h', '--help', 'Show this message') do
    puts opts
    exit 1
  end
  opts.on("--pid-dir=DIR", "Alternate directory in which to store the process ids. Default is #{@options[:pid_dir]}.") do |dir|
    @options[:pid_dir] = dir
  end
  opts.on('-i', '--identifier=STR', 'An identifier for the process. Default is clock file name.') do |n|
    @options[:identifier] = n
  end
  opts.on('-l', '--log', "Redirect both STDOUT and STDERR to a logfile named #{bin_basename}[.<identifier>].output in the pid-file directory.") do
    @options[:log_output] = true
  end
  opts.on('--log-dir=DIR', 'A specific directory to put the log files into (default location is pid directory).') do | log_dir|
    @options[:log_dir] = File.expand_path(log_dir)
  end
  opts.on('-m', '--monitor', 'Start monitor process.') do
    @options[:monitor] = true
  end
  opts.on('-c', '--clock=FILE',"Clock .rb file. Default is #{@options[:file]}.") do |clock_file|
    @options[:file] = clock_file
    @options[:file] = "./#{@options[:file]}" unless Pathname.new(@options[:file]).absolute?
    @options[:file] = File.expand_path(@options[:file])
  end
  opts.on('-d', '--dir=DIR', 'Directory to change to once the process starts') do |dir|
    @options[:current_dir] = File.expand_path(dir)
  end
end

@args = opts.parse!(ARGV)

def optparser_abort(opts,message)
  $stderr.puts message
  puts opts
  exit 1
end

optparser_abort opts, "ERROR: --clock=FILE is required." unless @options[:file]
optparser_abort opts, "ERROR: clock file #{@options[:file]} does not exist." unless File.exists?(@options[:file])
optparser_abort opts, "ERROR: File extension specified in --clock must be '.rb'" unless File.extname(@options[:file]) == ".rb"

@options[:identifier]  ||= "#{File.basename(@options[:file],'.*')}"
process_name = "#{bin_basename}.#{@options[:identifier]}"

@options[:log_dir] ||= @options[:pid_dir]

Dir.mkdir(@options[:pid_dir]) unless File.exists?(@options[:pid_dir])
Dir.mkdir(@options[:log_dir]) unless File.exists?(@options[:log_dir])

puts "#{process_name}: pid file: #{File.expand_path(File.join(@options[:pid_dir],process_name + '.pid'))}"

if @options[:log_output]
  puts "#{process_name}: output log file: #{File.expand_path(File.join(@options[:log_dir],process_name + '.output'))}"
else
  puts "#{process_name}: No output will be printed out (run with --log if needed)"
end

Daemons.run_proc(process_name, :dir => @options[:pid_dir], :dir_mode => :normal, :monitor => @options[:monitor], :log_dir => @options[:log_dir], :log_output => @options[:log_output], :ARGV => @args) do |*args|
  # daemons changes the current working directory to '/' when a new process is
  # forked. We change it back to the project root directory here.
  Dir.chdir(@options[:current_dir]) if @options[:current_dir]
  require @options[:file]

  Clockwork::run
end