foreverb 0.2.4 → 0.2.5
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/CHANGES.md +2 -2
- data/Gemfile +0 -4
- data/Rakefile +2 -2
- data/bin/foreverb +18 -1
- data/examples/sample +5 -1
- data/lib/forever/base.rb +89 -23
- data/lib/forever/version.rb +1 -1
- data/spec/cli_spec.rb +10 -1
- data/spec/foreverb_spec.rb +3 -2
- data/spec/spec_helper.rb +1 -1
- metadata +4 -5
- data/Guardfile +0 -5
data/CHANGES.md
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
# Version 0.2.4
|
1
|
+
# Version 0.2.4 - July 25, 2011
|
2
2
|
|
3
3
|
* Ruby 1.9.2 compatibility
|
4
4
|
* Stop process using pid instead of file
|
5
5
|
* Added specs
|
6
6
|
* Fixed `foreverb list` where in some scenarios don't return a list of processes
|
7
7
|
|
8
|
-
# Version 0.2.3
|
8
|
+
# Version 0.2.3 - July 21, 2011
|
9
9
|
|
10
10
|
* Added global monitoring, to easily watch each `foreverb` daemon
|
11
11
|
* Look daemons through config file and unix command `ps`
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ end
|
|
10
10
|
|
11
11
|
desc "Bump version on github"
|
12
12
|
task :bump do
|
13
|
-
puts "\e[31mNothing to commit (working directory clean)\e[0m" and return
|
13
|
+
puts "\e[31mNothing to commit (working directory clean)\e[0m" and return if `git status -s`.strip == ""
|
14
14
|
version = Bundler.load_gemspec(Dir[File.expand_path('../*.gemspec', __FILE__)].first).version
|
15
15
|
sh "git add .; git commit -a -m \"Bump to version #{version}\""
|
16
16
|
end
|
@@ -24,4 +24,4 @@ RSpec::Core::RakeTask.new("spec") do |t|
|
|
24
24
|
t.rspec_opts = %w(-fs --color --fail-fast)
|
25
25
|
end
|
26
26
|
|
27
|
-
task :default => :spec
|
27
|
+
task :default => :spec
|
data/bin/foreverb
CHANGED
@@ -50,6 +50,23 @@ class CLI < Thor
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
desc "kill [DAEMON] [--all] [--yes]", "Kill one or more matching daemons"
|
54
|
+
method_option :all, :type => :boolean, :aliases => "-a", :desc => "All matching daemons"
|
55
|
+
method_option :yes, :type => :boolean, :aliases => "-y", :desc => "Don't ask permission to kill daemon"
|
56
|
+
def kill(daemon=nil)
|
57
|
+
find(daemon, :multiple => options.all).each do |conf|
|
58
|
+
if options.yes || yes?("Do you want really kill \e[1m#{conf[:file]}\e[0m?")
|
59
|
+
say_status "KILLING", conf[:file]
|
60
|
+
begin
|
61
|
+
pid = File.read(conf[:pid]).to_i
|
62
|
+
Process.kill(:INT, pid)
|
63
|
+
rescue Exception => e
|
64
|
+
say_status "ERROR", e.message, :red
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
53
70
|
desc "start [DAEMON] [--all] [--yes]", "Start one or more matching daemons"
|
54
71
|
method_option :all, :type => :boolean, :aliases => "-a", :desc => "All matching daemons"
|
55
72
|
method_option :yes, :type => :boolean, :aliases => "-y", :desc => "Don't ask permission to start the daemon"
|
@@ -122,4 +139,4 @@ class CLI < Thor
|
|
122
139
|
end
|
123
140
|
|
124
141
|
ARGV << "-h" if ARGV.empty?
|
125
|
-
CLI.start(ARGV)
|
142
|
+
CLI.start(ARGV)
|
data/examples/sample
CHANGED
@@ -6,6 +6,10 @@ require 'forever'
|
|
6
6
|
Forever.run do
|
7
7
|
dir File.expand_path('../', __FILE__) # Default is ../../__FILE__
|
8
8
|
|
9
|
+
every 5.seconds do
|
10
|
+
puts 'every 5 seconds'
|
11
|
+
end
|
12
|
+
|
9
13
|
on_ready do
|
10
14
|
puts "All jobs will will wait me for 1 second"; sleep 1
|
11
15
|
end
|
@@ -50,4 +54,4 @@ Forever.run do
|
|
50
54
|
on_exit do
|
51
55
|
puts "Bye bye"
|
52
56
|
end
|
53
|
-
end
|
57
|
+
end
|
data/lib/forever/base.rb
CHANGED
@@ -16,20 +16,37 @@ module Forever
|
|
16
16
|
|
17
17
|
write_config!
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
case ARGV[0]
|
20
|
+
when 'config'
|
21
|
+
print config.to_yaml
|
22
|
+
exit
|
23
|
+
when 'start', 'restart', 'up', nil
|
24
|
+
stop
|
25
|
+
when 'stop'
|
26
|
+
stop
|
27
|
+
exit
|
28
|
+
when 'kill'
|
29
|
+
stop!
|
30
|
+
exit
|
31
|
+
when 'help', '-h'
|
32
|
+
print <<-RUBY.gsub(/ {10}/,'') % File.basename(file)
|
33
|
+
Usage: \e[1m./%s\e[0m [start|stop|kill|restart|config]
|
34
|
+
|
35
|
+
Commands:
|
36
|
+
|
37
|
+
start stop (if present) the daemon and perform a start
|
38
|
+
stop stop the daemon if a during when it is idle
|
39
|
+
restart same as start
|
40
|
+
kill force stop by sending a KILL signal to the process
|
41
|
+
config show the current daemons config
|
42
|
+
|
43
|
+
RUBY
|
44
|
+
exit
|
22
45
|
end
|
23
46
|
|
24
|
-
return if ARGV.any? { |arg| arg == "up" }
|
25
|
-
|
26
|
-
stop!
|
27
|
-
|
28
|
-
return if ARGV.any? { |arg| arg == "stop" }
|
29
|
-
|
30
47
|
fork do
|
31
48
|
$0 = "Forever: #{$0}"
|
32
|
-
print "=> Process demonized with pid #{Process.pid} with Forever v.#{Forever::VERSION}\n"
|
49
|
+
print "=> Process demonized with pid \e[1m#{Process.pid}\e[0m with Forever v.#{Forever::VERSION}\n"
|
33
50
|
|
34
51
|
%w(INT TERM KILL).each { |signal| trap(signal) { stop! } }
|
35
52
|
trap(:HUP) do
|
@@ -46,12 +63,25 @@ module Forever
|
|
46
63
|
|
47
64
|
threads = []
|
48
65
|
safe_call(on_ready) if on_ready
|
66
|
+
started_at = Time.now
|
67
|
+
|
49
68
|
jobs.each do |job|
|
50
69
|
threads << Thread.new do
|
51
|
-
loop
|
70
|
+
loop do
|
71
|
+
break if File.exist?(stop_txt) && File.mtime(stop_txt) > started_at
|
72
|
+
job.time?(Time.now) ? safe_call(job) : sleep(1)
|
73
|
+
end
|
52
74
|
end
|
53
75
|
end
|
76
|
+
|
77
|
+
# Launch our workers
|
54
78
|
threads.map(&:join)
|
79
|
+
|
80
|
+
# If we are here it means we are exiting so we can remove the pid and pending stop.txt
|
81
|
+
FileUtils.rm_f(pid)
|
82
|
+
FileUtils.rm_f(stop_txt)
|
83
|
+
|
84
|
+
on_exit.call if on_exit
|
55
85
|
end
|
56
86
|
|
57
87
|
self
|
@@ -95,19 +125,30 @@ module Forever
|
|
95
125
|
# Search if there is a running process and stop it
|
96
126
|
#
|
97
127
|
def stop!
|
98
|
-
|
99
|
-
|
100
|
-
|
128
|
+
FileUtils.rm_f(stop_txt)
|
129
|
+
if running?
|
130
|
+
pid_was = File.read(pid).to_i
|
101
131
|
FileUtils.rm_f(pid)
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
Process.kill(:KILL, _pid)
|
106
|
-
rescue Errno::ESRCH => e
|
107
|
-
puts "=> #{e.message}"
|
108
|
-
end
|
132
|
+
print "=> Killing process \e[1m%d\e[0m...\n" % pid_was
|
133
|
+
on_exit.call if on_exit
|
134
|
+
Process.kill(:KILL, pid_was)
|
109
135
|
else
|
110
|
-
print "=>
|
136
|
+
print "=> Process with \e[1mnot found\e[0m"
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
##
|
141
|
+
# Perform a soft stop
|
142
|
+
#
|
143
|
+
def stop
|
144
|
+
if running?
|
145
|
+
print '=> Waiting the daemon\'s death '
|
146
|
+
FileUtils.touch(stop_txt)
|
147
|
+
while running?(true)
|
148
|
+
print '.'; $stdout.flush
|
149
|
+
sleep 1
|
150
|
+
end
|
151
|
+
print " \e[1mDONE\e[0m\n"
|
111
152
|
end
|
112
153
|
end
|
113
154
|
|
@@ -132,6 +173,27 @@ module Forever
|
|
132
173
|
block_given? ? @_on_ready = block : @_on_ready
|
133
174
|
end
|
134
175
|
|
176
|
+
##
|
177
|
+
# Returns true if the pid exist and the process is running
|
178
|
+
#
|
179
|
+
def running?(silent=false)
|
180
|
+
if exists?(pid)
|
181
|
+
current = File.read(pid).to_i
|
182
|
+
print "=> Found pid \e[1m%d\e[0m...\n" % current unless silent
|
183
|
+
else
|
184
|
+
print "=> Pid \e[1mnot found\e[0m, process seems don't exist!\n" unless silent
|
185
|
+
return false
|
186
|
+
end
|
187
|
+
|
188
|
+
is_running = begin
|
189
|
+
Process.kill(0, current)
|
190
|
+
rescue Errno::ESRCH
|
191
|
+
false
|
192
|
+
end
|
193
|
+
|
194
|
+
is_running
|
195
|
+
end
|
196
|
+
|
135
197
|
def to_s
|
136
198
|
"#<Forever dir:#{dir}, file:#{file}, log:#{log}, pid:#{pid} jobs:#{jobs.size}>"
|
137
199
|
end
|
@@ -161,5 +223,9 @@ module Forever
|
|
161
223
|
on_error[e] if on_error
|
162
224
|
end
|
163
225
|
end
|
226
|
+
|
227
|
+
def stop_txt
|
228
|
+
@_stop_txt ||= File.join(dir, 'stop.txt')
|
229
|
+
end
|
164
230
|
end # Base
|
165
|
-
end # Forever
|
231
|
+
end # Forever
|
data/lib/forever/version.rb
CHANGED
data/spec/cli_spec.rb
CHANGED
@@ -22,4 +22,13 @@ describe "CLI" do
|
|
22
22
|
result.should_not match(/ERROR/)
|
23
23
|
cli('list').should match(/NOT RUNNING/)
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
|
+
it "should kill daemons" do
|
27
|
+
run_example
|
28
|
+
cli('list').should match(/RUNNING/)
|
29
|
+
result = cli('kill -a -y')
|
30
|
+
result.should match(/KILLING/)
|
31
|
+
result.should_not match(/ERROR/)
|
32
|
+
cli('list').should match(/NOT RUNNING/)
|
33
|
+
end
|
34
|
+
end
|
data/spec/foreverb_spec.rb
CHANGED
@@ -3,6 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Forever do
|
4
4
|
|
5
5
|
before :each do
|
6
|
+
$stdout = StringIO.new
|
6
7
|
ARGV << 'up'
|
7
8
|
end
|
8
9
|
|
@@ -41,7 +42,7 @@ describe Forever do
|
|
41
42
|
sleep 0.1 while !File.exist?(@forever.pid)
|
42
43
|
pid = File.read(@forever.pid).to_i
|
43
44
|
Process.waitpid(pid)
|
44
|
-
$stdout.string.should match(/
|
45
|
+
$stdout.string.should match(/not found/i)
|
45
46
|
$stdout = stdout_was
|
46
47
|
end
|
47
|
-
end
|
48
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreverb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 5
|
10
|
+
version: 0.2.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- DAddYE
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-08-26 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -63,7 +63,6 @@ files:
|
|
63
63
|
- .gitignore
|
64
64
|
- CHANGES.md
|
65
65
|
- Gemfile
|
66
|
-
- Guardfile
|
67
66
|
- README.md
|
68
67
|
- Rakefile
|
69
68
|
- bin/foreverb
|