god 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +43 -7
- data/Manifest.txt +20 -4
- data/Rakefile +1 -1
- data/bin/god +263 -195
- data/examples/events.god +66 -34
- data/examples/gravatar.god +25 -12
- data/init/god +42 -0
- data/lib/god/behavior.rb +9 -29
- data/lib/god/behaviors/clean_pid_file.rb +6 -2
- data/lib/god/behaviors/notify_when_flapping.rb +4 -4
- data/lib/god/condition.rb +48 -6
- data/lib/god/conditions/always.rb +5 -1
- data/lib/god/conditions/cpu_usage.rb +13 -5
- data/lib/god/conditions/degrading_lambda.rb +8 -3
- data/lib/god/conditions/flapping.rb +97 -0
- data/lib/god/conditions/http_response_code.rb +97 -0
- data/lib/god/conditions/lambda.rb +8 -2
- data/lib/god/conditions/memory_usage.rb +13 -5
- data/lib/god/conditions/process_exits.rb +11 -3
- data/lib/god/conditions/process_running.rb +22 -4
- data/lib/god/conditions/tries.rb +16 -5
- data/lib/god/configurable.rb +54 -0
- data/lib/god/contact.rb +106 -0
- data/lib/god/contacts/email.rb +73 -0
- data/lib/god/errors.rb +3 -0
- data/lib/god/hub.rb +138 -33
- data/lib/god/logger.rb +21 -4
- data/lib/god/metric.rb +3 -4
- data/lib/god/process.rb +93 -49
- data/lib/god/socket.rb +60 -0
- data/lib/god/task.rb +233 -0
- data/lib/god/trigger.rb +43 -0
- data/lib/god/watch.rb +48 -114
- data/lib/god.rb +216 -63
- data/test/configs/child_events/child_events.god +20 -1
- data/test/configs/child_polls/child_polls.god +26 -6
- data/test/configs/child_polls/simple_server.rb +10 -1
- data/test/configs/contact/contact.god +74 -0
- data/test/configs/contact/simple_server.rb +3 -0
- data/test/configs/daemon_events/daemon_events.god +5 -2
- data/test/configs/daemon_events/simple_server.rb +2 -0
- data/test/configs/daemon_events/simple_server_stop.rb +9 -0
- data/test/configs/degrading_lambda/degrading_lambda.god +1 -3
- data/test/configs/task/logs/.placeholder +0 -0
- data/test/configs/task/task.god +26 -0
- data/test/helper.rb +19 -11
- data/test/test_conditions_http_response_code.rb +115 -0
- data/test/test_conditions_process_running.rb +2 -2
- data/test/test_conditions_tries.rb +21 -0
- data/test/test_contact.rb +109 -0
- data/test/test_god.rb +101 -17
- data/test/test_hub.rb +64 -1
- data/test/test_process.rb +43 -56
- data/test/{test_server.rb → test_socket.rb} +6 -20
- data/test/test_task.rb +86 -0
- data/test/test_trigger.rb +59 -0
- data/test/test_watch.rb +32 -7
- metadata +27 -8
- data/lib/god/reporter.rb +0 -25
- data/lib/god/server.rb +0 -37
- data/test/test_reporter.rb +0 -18
data/History.txt
CHANGED
@@ -1,16 +1,52 @@
|
|
1
|
-
== 0.
|
1
|
+
== 0.5.0 / 2007-10-05
|
2
|
+
|
3
|
+
* Major Enhancements
|
4
|
+
* Implement lifecycle scoped metric to allow for cross-state conditions
|
5
|
+
* Add TriggerCondition for conditions that need info about state changes
|
6
|
+
* Implement notification system
|
7
|
+
* Add Tasks (a generalization of Watches) to do non-process related tasks
|
8
|
+
* Add example init.d file in GOD_INSTALL_DIR/init/god [scott becker]
|
9
|
+
* Add human readable info to conditions (and make low level log lines debug)
|
10
|
+
* Switch DRb to use a unix domain socket for security reasons
|
11
|
+
* Minor Enchancements
|
12
|
+
* Allow EventConditions to do transition overloading
|
13
|
+
* Report errors during god startup instead of failing silently
|
14
|
+
* Make transition block optional (default to Always condition returning true)
|
15
|
+
* Better usage info for `god --help`
|
16
|
+
* Explain what's going on when attempting to rebind to an in-use port
|
17
|
+
* Add -b option to god binary to auto-bind to an unused port
|
18
|
+
* Add `god quit` to stop god without stopping any tasks
|
19
|
+
* Make self-daemonized Watch commands synchronous (as they should be)
|
20
|
+
* Allow self-daemonized Watches to specify a log (could be useful)
|
21
|
+
* Check for existence of config file if specified
|
22
|
+
* Robustify `god load` and report errors back to the command issuer
|
23
|
+
* Warn when `god load` tries to set global options
|
24
|
+
* Add Configurable.clear method and make built-in conditions clear on entry
|
25
|
+
* New Conditions
|
26
|
+
* Flapping < TriggerCondition - trigger on state change
|
27
|
+
* HttpResponseCode < PollCondition - trigger on http response code or timeout (thx scott becker)
|
28
|
+
* New Contacts
|
29
|
+
* Email < Contact - notify via email (smtp)
|
30
|
+
* Bug Fixes
|
31
|
+
* Fix abort not aborting problem
|
32
|
+
* Fix -p option not working for god binary
|
33
|
+
* Fix God.init not accepting block (thx _eric)
|
34
|
+
* Fix SIGHUP ignore (thx _eric)
|
35
|
+
* Fix error reporting on `god --help` (don't error report a normal SystemExit)
|
36
|
+
|
37
|
+
== 0.4.3 / 2007-09-10
|
2
38
|
* Bug Fixes
|
3
|
-
* fix Process#alive? to not raise on no such file
|
39
|
+
* fix Process#alive? to not raise on no such file (affects `god terminate`)
|
4
40
|
|
5
|
-
== 0.4.2
|
41
|
+
== 0.4.2 / 2007-09-10
|
6
42
|
* Bug Fixes
|
7
|
-
* fix netlink events [dkresge]
|
43
|
+
* fix netlink buffer issue that prevented events on Linux from working consistently [dkresge]
|
8
44
|
|
9
|
-
== 0.4.1
|
45
|
+
== 0.4.1 / 2007-09-10
|
10
46
|
* Bug Fixes
|
11
47
|
* require 'stringio' for ruby 1.8.5
|
12
48
|
|
13
|
-
== 0.4.0
|
49
|
+
== 0.4.0 / 2007-09-10
|
14
50
|
|
15
51
|
* Major Enhancements
|
16
52
|
* Add the ability for conditions to override transition state (for exceptional cases)
|
@@ -34,7 +70,7 @@
|
|
34
70
|
* Bug Fixes
|
35
71
|
* Use exit!(0) instead of exit! in god binary to exit with code 0 (instead of default -1)
|
36
72
|
* Command line group control fixed
|
37
|
-
* Fix cross-thread return problem
|
73
|
+
* Fix cross-thread return problem
|
38
74
|
|
39
75
|
== 0.3.0 / 2007-08-17
|
40
76
|
|
data/Manifest.txt
CHANGED
@@ -8,6 +8,7 @@ examples/gravatar.god
|
|
8
8
|
ext/god/extconf.rb
|
9
9
|
ext/god/kqueue_handler.c
|
10
10
|
ext/god/netlink_handler.c
|
11
|
+
init/god
|
11
12
|
lib/god.rb
|
12
13
|
lib/god/behavior.rb
|
13
14
|
lib/god/behaviors/clean_pid_file.rb
|
@@ -16,11 +17,16 @@ lib/god/condition.rb
|
|
16
17
|
lib/god/conditions/always.rb
|
17
18
|
lib/god/conditions/cpu_usage.rb
|
18
19
|
lib/god/conditions/degrading_lambda.rb
|
20
|
+
lib/god/conditions/flapping.rb
|
21
|
+
lib/god/conditions/http_response_code.rb
|
19
22
|
lib/god/conditions/lambda.rb
|
20
23
|
lib/god/conditions/memory_usage.rb
|
21
24
|
lib/god/conditions/process_exits.rb
|
22
25
|
lib/god/conditions/process_running.rb
|
23
26
|
lib/god/conditions/tries.rb
|
27
|
+
lib/god/configurable.rb
|
28
|
+
lib/god/contact.rb
|
29
|
+
lib/god/contacts/email.rb
|
24
30
|
lib/god/dependency_graph.rb
|
25
31
|
lib/god/errors.rb
|
26
32
|
lib/god/event_handler.rb
|
@@ -32,19 +38,23 @@ lib/god/logger.rb
|
|
32
38
|
lib/god/metric.rb
|
33
39
|
lib/god/process.rb
|
34
40
|
lib/god/registry.rb
|
35
|
-
lib/god/
|
36
|
-
lib/god/server.rb
|
41
|
+
lib/god/socket.rb
|
37
42
|
lib/god/sugar.rb
|
38
43
|
lib/god/system/process.rb
|
44
|
+
lib/god/task.rb
|
39
45
|
lib/god/timeline.rb
|
40
46
|
lib/god/timer.rb
|
47
|
+
lib/god/trigger.rb
|
41
48
|
lib/god/watch.rb
|
42
49
|
test/configs/child_events/child_events.god
|
43
50
|
test/configs/child_events/simple_server.rb
|
44
51
|
test/configs/child_polls/child_polls.god
|
45
52
|
test/configs/child_polls/simple_server.rb
|
53
|
+
test/configs/contact/contact.god
|
54
|
+
test/configs/contact/simple_server.rb
|
46
55
|
test/configs/daemon_events/daemon_events.god
|
47
56
|
test/configs/daemon_events/simple_server.rb
|
57
|
+
test/configs/daemon_events/simple_server_stop.rb
|
48
58
|
test/configs/daemon_polls/daemon_polls.god
|
49
59
|
test/configs/daemon_polls/simple_server.rb
|
50
60
|
test/configs/degrading_lambda/degrading_lambda.god
|
@@ -53,12 +63,17 @@ test/configs/real.rb
|
|
53
63
|
test/configs/running_load/running_load.god
|
54
64
|
test/configs/stress/simple_server.rb
|
55
65
|
test/configs/stress/stress.god
|
66
|
+
test/configs/task/logs/.placeholder
|
67
|
+
test/configs/task/task.god
|
56
68
|
test/configs/test.rb
|
57
69
|
test/helper.rb
|
58
70
|
test/suite.rb
|
59
71
|
test/test_behavior.rb
|
60
72
|
test/test_condition.rb
|
73
|
+
test/test_conditions_http_response_code.rb
|
61
74
|
test/test_conditions_process_running.rb
|
75
|
+
test/test_conditions_tries.rb
|
76
|
+
test/test_contact.rb
|
62
77
|
test/test_dependency_graph.rb
|
63
78
|
test/test_event_handler.rb
|
64
79
|
test/test_god.rb
|
@@ -68,10 +83,11 @@ test/test_logger.rb
|
|
68
83
|
test/test_metric.rb
|
69
84
|
test/test_process.rb
|
70
85
|
test/test_registry.rb
|
71
|
-
test/
|
72
|
-
test/test_server.rb
|
86
|
+
test/test_socket.rb
|
73
87
|
test/test_sugar.rb
|
74
88
|
test/test_system_process.rb
|
89
|
+
test/test_task.rb
|
75
90
|
test/test_timeline.rb
|
76
91
|
test/test_timer.rb
|
92
|
+
test/test_trigger.rb
|
77
93
|
test/test_watch.rb
|
data/Rakefile
CHANGED
data/bin/god
CHANGED
@@ -1,234 +1,302 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
STDOUT.sync = true
|
4
|
+
|
3
5
|
$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
|
4
6
|
|
5
7
|
require 'rubygems'
|
6
8
|
require 'optparse'
|
7
9
|
require 'drb'
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
OptionParser.new do |opts|
|
12
|
-
opts.banner = <<-EOF
|
13
|
-
Usage: god [command] [options]
|
14
|
-
|
15
|
-
Commands:
|
16
|
-
start <watch or group name>
|
17
|
-
restart <watch or group name>
|
18
|
-
stop <watch or group name>
|
19
|
-
monitor <watch or group name>
|
20
|
-
unmonitor <watch or group name>
|
21
|
-
load <file>
|
22
|
-
log <watch name>
|
23
|
-
status
|
24
|
-
terminate
|
25
|
-
|
26
|
-
Options:
|
27
|
-
EOF
|
28
|
-
|
29
|
-
opts.on("-cCONFIG", "--config-file CONFIG", "Configuration file") do |x|
|
30
|
-
options[:config] = x
|
31
|
-
end
|
32
|
-
|
33
|
-
opts.on("-pPORT", "--port PORT", "Communications port") do |x|
|
34
|
-
options[:port] = x
|
35
|
-
end
|
36
|
-
|
37
|
-
opts.on("-PFILE", "--pid FILE", "Where to write the PID file") do |x|
|
38
|
-
options[:pid] = x
|
39
|
-
end
|
40
|
-
|
41
|
-
opts.on("-lFILE", "--log FILE", "Where to write the log file") do |x|
|
42
|
-
options[:log] = x
|
43
|
-
end
|
44
|
-
|
45
|
-
opts.on("-D", "--no-daemonize", "Don't daemonize") do
|
46
|
-
options[:daemonize] = false
|
47
|
-
end
|
48
|
-
|
49
|
-
opts.on("-v", "--version", "Print the version number and exit") do
|
50
|
-
options[:version] = true
|
51
|
-
end
|
52
|
-
|
53
|
-
opts.on("-V", "Print extended version and build information") do
|
54
|
-
options[:info] = true
|
55
|
-
end
|
56
|
-
end.parse!
|
11
|
+
begin
|
12
|
+
options = {:daemonize => true, :port => 17165}
|
57
13
|
|
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
|
-
puts "The server is not available (or you do not have permissions to access it)"
|
85
|
-
exit!
|
86
|
-
rescue => e
|
87
|
-
puts e.message
|
88
|
-
puts e.backtrace.join("\n")
|
89
|
-
exit!
|
90
|
-
end
|
14
|
+
opts = OptionParser.new do |opts|
|
15
|
+
opts.banner = <<-EOF
|
16
|
+
Usage:
|
17
|
+
Starting:
|
18
|
+
god -c <config file> [-p <port> | -b] [-P <file>] [-l <file>] [-D]
|
19
|
+
|
20
|
+
Querying:
|
21
|
+
god <command> <argument> [-p <port>]
|
22
|
+
god <command> [-p <port>]
|
23
|
+
god -v
|
24
|
+
god -V (must be run as root to be accurate on Linux)
|
25
|
+
|
26
|
+
Commands:
|
27
|
+
start <task or group name> start task or group
|
28
|
+
restart <task or group name> restart task or group
|
29
|
+
stop <task or group name> stop task or group
|
30
|
+
monitor <task or group name> monitor task or group
|
31
|
+
unmonitor <task or group name> unmonitor task or group
|
32
|
+
load <file> load a config into a running god
|
33
|
+
log <task name> show realtime log for given task
|
34
|
+
status show status of each task
|
35
|
+
quit stop god
|
36
|
+
terminate stop god and all tasks
|
37
|
+
|
38
|
+
Options:
|
39
|
+
EOF
|
91
40
|
|
92
|
-
|
93
|
-
|
41
|
+
opts.on("-cCONFIG", "--config-file CONFIG", "Configuration file") do |x|
|
42
|
+
options[:config] = x
|
43
|
+
end
|
94
44
|
|
95
|
-
|
45
|
+
opts.on("-pPORT", "--port PORT", "Communications port (default 17165)") do |x|
|
46
|
+
options[:port] = x
|
47
|
+
end
|
96
48
|
|
97
|
-
|
49
|
+
opts.on("-b", "--auto-bind", "Auto-bind to an unused port number") do
|
50
|
+
options[:port] = "0"
|
51
|
+
end
|
98
52
|
|
99
|
-
|
53
|
+
opts.on("-PFILE", "--pid FILE", "Where to write the PID file") do |x|
|
54
|
+
options[:pid] = x
|
55
|
+
end
|
100
56
|
|
101
|
-
|
102
|
-
|
103
|
-
watches.each do |w|
|
104
|
-
puts ' ' + w.name
|
57
|
+
opts.on("-lFILE", "--log FILE", "Where to write the log file") do |x|
|
58
|
+
options[:log] = x
|
105
59
|
end
|
106
60
|
|
107
|
-
|
108
|
-
|
109
|
-
watches = server.status
|
110
|
-
watches.keys.sort.each do |name|
|
111
|
-
state = watches[name][:state]
|
112
|
-
puts "#{name}: #{state}"
|
61
|
+
opts.on("-D", "--no-daemonize", "Don't daemonize") do
|
62
|
+
options[:daemonize] = false
|
113
63
|
end
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
name = ARGV[1]
|
118
|
-
t = Time.at(0)
|
119
|
-
loop do
|
120
|
-
print server.running_log(name, t)
|
121
|
-
t = Time.now
|
122
|
-
sleep 1
|
123
|
-
end
|
124
|
-
rescue God::NoSuchWatchError
|
125
|
-
puts "No such watch"
|
126
|
-
rescue DRb::DRbConnError
|
127
|
-
puts "The server went away"
|
128
|
-
rescue => e
|
129
|
-
puts e.message
|
130
|
-
puts e.backtrace.join("\n")
|
131
|
-
ensure
|
132
|
-
exit!(0)
|
64
|
+
|
65
|
+
opts.on("-v", "--version", "Print the version number and exit") do
|
66
|
+
options[:version] = true
|
133
67
|
end
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
t.kill; STDOUT.puts
|
138
|
-
puts 'Stopped all watches'
|
139
|
-
else
|
140
|
-
t.kill; STDOUT.puts
|
141
|
-
puts 'Could not stop all watches within 10 seconds'
|
68
|
+
|
69
|
+
opts.on("-V", "Print extended version and build information") do
|
70
|
+
options[:info] = true
|
142
71
|
end
|
72
|
+
end
|
73
|
+
|
74
|
+
opts.parse!
|
75
|
+
|
76
|
+
if options[:version]
|
77
|
+
require 'god'
|
78
|
+
|
79
|
+
# print version
|
80
|
+
puts "Version #{God::VERSION}"
|
81
|
+
exit
|
82
|
+
elsif options[:info]
|
83
|
+
require 'god'
|
84
|
+
|
85
|
+
puts "Version: #{God::VERSION}"
|
86
|
+
puts "Polls: enabled"
|
87
|
+
puts "Events: " + God::EventHandler.event_system
|
88
|
+
|
89
|
+
exit
|
90
|
+
elsif command = ARGV[0]
|
91
|
+
require 'god'
|
92
|
+
|
93
|
+
# a command was specified
|
94
|
+
|
95
|
+
# connect to drb unix socket
|
96
|
+
DRb.start_service
|
97
|
+
server = DRbObject.new(nil, God::Socket.socket(options[:port]))
|
143
98
|
|
144
99
|
begin
|
145
|
-
server.
|
146
|
-
abort 'Could not stop god'
|
100
|
+
server.ping
|
147
101
|
rescue DRb::DRbConnError
|
148
|
-
puts
|
149
|
-
|
102
|
+
puts "The server is not available (or you do not have permissions to access it)"
|
103
|
+
abort
|
150
104
|
end
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
begin
|
105
|
+
|
106
|
+
if command == 'load'
|
107
|
+
file = ARGV[1]
|
108
|
+
|
156
109
|
puts "Sending '#{command}' command"
|
110
|
+
puts
|
111
|
+
|
112
|
+
unless File.exist?(file)
|
113
|
+
abort "File not found: #{file}"
|
114
|
+
end
|
115
|
+
|
116
|
+
names, errors = *server.running_load(File.read(file), File.expand_path(file))
|
157
117
|
|
158
|
-
t = Thread.new { loop { STDOUT.print('.'); STDOUT.flush; sleep(1) } }
|
159
|
-
|
160
|
-
# send command
|
161
|
-
watches = server.control(name, command)
|
162
|
-
|
163
118
|
# output response
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
119
|
+
unless names.empty?
|
120
|
+
puts 'The following tasks were affected:'
|
121
|
+
names.each do |w|
|
122
|
+
puts ' ' + w
|
123
|
+
end
|
168
124
|
end
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
125
|
+
|
126
|
+
unless errors.empty?
|
127
|
+
puts errors
|
128
|
+
exit(1)
|
129
|
+
end
|
130
|
+
elsif command == 'status'
|
131
|
+
watches = server.status
|
132
|
+
watches.keys.sort.each do |name|
|
133
|
+
state = watches[name][:state]
|
134
|
+
puts "#{name}: #{state}"
|
135
|
+
end
|
136
|
+
elsif command == 'log'
|
137
|
+
begin
|
138
|
+
Signal.trap('INT') { exit }
|
139
|
+
name = ARGV[1]
|
140
|
+
t = Time.at(0)
|
141
|
+
loop do
|
142
|
+
print server.running_log(name, t)
|
143
|
+
t = Time.now
|
144
|
+
sleep 1
|
145
|
+
end
|
146
|
+
rescue God::NoSuchWatchError
|
147
|
+
puts "No such watch"
|
148
|
+
rescue DRb::DRbConnError
|
149
|
+
puts "The server went away"
|
150
|
+
end
|
151
|
+
elsif command == 'quit'
|
152
|
+
begin
|
153
|
+
server.terminate
|
154
|
+
abort 'Could not stop god'
|
155
|
+
rescue DRb::DRbConnError
|
156
|
+
puts 'Stopped god'
|
157
|
+
end
|
158
|
+
elsif command == 'terminate'
|
159
|
+
t = Thread.new { loop { STDOUT.print('.'); STDOUT.flush; sleep(1) } }
|
160
|
+
if server.stop_all
|
161
|
+
t.kill; STDOUT.puts
|
162
|
+
puts 'Stopped all watches'
|
163
|
+
else
|
164
|
+
t.kill; STDOUT.puts
|
165
|
+
puts 'Could not stop all watches within 10 seconds'
|
166
|
+
end
|
167
|
+
|
168
|
+
begin
|
169
|
+
server.terminate
|
170
|
+
abort 'Could not stop god'
|
171
|
+
rescue DRb::DRbConnError
|
172
|
+
puts 'Stopped god'
|
173
|
+
end
|
174
|
+
else
|
175
|
+
# get the name of the watch/group
|
176
|
+
name = ARGV[1]
|
177
|
+
|
187
178
|
begin
|
188
|
-
|
179
|
+
puts "Sending '#{command}' command"
|
189
180
|
|
190
|
-
|
181
|
+
t = Thread.new { loop { sleep(1); STDOUT.print('.'); STDOUT.flush; sleep(1) } }
|
191
182
|
|
192
|
-
|
193
|
-
|
194
|
-
STDERR.reopen STDOUT
|
183
|
+
# send command
|
184
|
+
watches = server.control(name, command)
|
195
185
|
|
196
|
-
|
197
|
-
|
198
|
-
unless
|
199
|
-
puts
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
puts
|
205
|
-
puts "***********************************************************************"
|
206
|
-
puts
|
186
|
+
# output response
|
187
|
+
t.kill; STDOUT.puts
|
188
|
+
unless watches.empty?
|
189
|
+
puts 'The following watches were affected:'
|
190
|
+
watches.each do |w|
|
191
|
+
puts ' ' + w
|
192
|
+
end
|
193
|
+
else
|
194
|
+
puts 'No matching task or group'
|
207
195
|
end
|
196
|
+
rescue God::InvalidCommandError
|
197
|
+
t.kill rescue nil; STDOUT.puts
|
198
|
+
abort "Command '#{command}' is not valid. Run 'god --help' for usage"
|
199
|
+
end
|
200
|
+
end
|
201
|
+
else
|
202
|
+
# start god
|
203
|
+
$run = true
|
208
204
|
|
209
|
-
|
210
|
-
|
211
|
-
|
205
|
+
if !options[:daemonize]
|
206
|
+
require 'god'
|
207
|
+
|
208
|
+
if options[:port]
|
209
|
+
God.port = options[:port]
|
210
|
+
end
|
211
|
+
|
212
|
+
if options[:config]
|
213
|
+
unless File.exist?(options[:config])
|
214
|
+
abort "File not found: #{options[:config]}"
|
215
|
+
end
|
212
216
|
|
213
|
-
|
214
|
-
|
217
|
+
begin
|
218
|
+
load File.expand_path(options[:config])
|
219
|
+
rescue Exception => e
|
220
|
+
if e.instance_of?(SystemExit)
|
221
|
+
raise
|
222
|
+
else
|
223
|
+
puts e.message
|
224
|
+
puts e.backtrace.join("\n")
|
225
|
+
abort "There was an error in your configuration file (see above)"
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
else
|
230
|
+
# trap and ignore SIGHUP
|
231
|
+
Signal.trap('HUP') {}
|
232
|
+
|
233
|
+
pid = fork do
|
234
|
+
begin
|
235
|
+
require 'god'
|
236
|
+
|
237
|
+
log_file = options[:log] || "/dev/null"
|
238
|
+
|
239
|
+
unless God::EventHandler.loaded?
|
240
|
+
puts
|
241
|
+
puts "***********************************************************************"
|
242
|
+
puts "*"
|
243
|
+
puts "* Event conditions are not available for your installation of god."
|
244
|
+
puts "* You may still use and write custom conditions using the poll system"
|
245
|
+
puts "*"
|
246
|
+
puts "***********************************************************************"
|
247
|
+
puts
|
248
|
+
end
|
249
|
+
|
250
|
+
# set port if requested
|
251
|
+
if options[:port]
|
252
|
+
God.port = options[:port]
|
253
|
+
end
|
254
|
+
|
255
|
+
# load config
|
256
|
+
if options[:config]
|
257
|
+
unless File.exist?(options[:config])
|
258
|
+
abort "File not found: #{options[:config]}"
|
259
|
+
end
|
260
|
+
|
261
|
+
begin
|
262
|
+
load File.expand_path(options[:config])
|
263
|
+
rescue Exception => e
|
264
|
+
if e.instance_of?(SystemExit)
|
265
|
+
raise
|
266
|
+
else
|
267
|
+
puts e.message
|
268
|
+
puts e.backtrace.join("\n")
|
269
|
+
abort "There was an error in your configuration file (see above)"
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
# reset file descriptors
|
275
|
+
STDIN.reopen "/dev/null"
|
276
|
+
STDOUT.reopen(log_file, "a")
|
277
|
+
STDERR.reopen STDOUT
|
278
|
+
rescue => e
|
279
|
+
puts e.message
|
280
|
+
puts e.backtrace.join("\n")
|
281
|
+
abort "There was a fatal system error while starting god (see above)"
|
215
282
|
end
|
283
|
+
end
|
216
284
|
|
217
|
-
|
218
|
-
|
219
|
-
Signal.trap('HUP') {}
|
220
|
-
rescue => e
|
221
|
-
File.open('god.log', 'a') { |f| f.puts e.message + "\n" + e.backtrace }
|
222
|
-
abort "!!! ERROR - See god.log !!!"
|
285
|
+
if options[:pid]
|
286
|
+
File.open(options[:pid], 'w') { |f| f.write pid }
|
223
287
|
end
|
288
|
+
|
289
|
+
::Process.detach pid
|
290
|
+
|
291
|
+
exit
|
224
292
|
end
|
225
|
-
|
226
|
-
if options[:pid]
|
227
|
-
File.open(options[:pid], 'w') { |f| f.write pid }
|
228
|
-
end
|
229
|
-
|
230
|
-
::Process.detach pid
|
231
|
-
|
232
|
-
exit!(0)
|
233
293
|
end
|
234
|
-
|
294
|
+
rescue Exception => e
|
295
|
+
if e.instance_of?(SystemExit)
|
296
|
+
raise
|
297
|
+
else
|
298
|
+
puts 'Uncaught exception'
|
299
|
+
puts e.message
|
300
|
+
puts e.backtrace.join("\n")
|
301
|
+
end
|
302
|
+
end
|