Compare commits

...
41 Commits
Author SHA1 Message Date
David Dollar 2ebb33e049 0.62.0 2013-03-08 14:52:50 -05:00
David Dollar 9fe7ddb8bd Merge pull request #334 from ged/reentrant_signal_handlers
Add deferred signal-handling (fixes #332).
2013-03-08 11:41:12 -08:00
David Dollar f954a42ecb Merge pull request #335 from ged/20_encoding_fix
Fix spec encoding problem under Ruby 2.0.0.
2013-03-08 11:40:50 -08:00
Michael Granger 169188376b Try to allow children to shut down gracefully
Since signals will no longer be handled once foreman goes into
`terminate_gracefully`, default signal handlers are restored so as
not to cause it to get stuck in an unTERMable state.

This necessitates not using the process group for signalling
except as a last resort, as foreman itself will receive the signals
it sends. This splits `killall` into two methods, one which
signals only processes foreman itself has started, and one which
signals all processes in the process group to try to clean up
more aggressively, and then reworks `terminate_gracefully` to use
them.
2013-03-04 14:05:53 -08:00
Michael Granger 5ab08c608b Add deferred signal-handling (fixes #332).
This uses a thread-local queue and a self-pipe so the code in the
trap blocks is properly re-entrant.

For details, see:

  * http://cr.yp.to/docs/selfpipe.html
  * http://blog.rubybestpractices.com/posts/ewong/016-Implementing-Signal-Handlers.html
2013-03-04 13:28:37 -08:00
Michael Granger 0b5c1f919e Fix spec encoding problem under Ruby 2.0.0. 2013-03-04 13:03:13 -08:00
David Dollar c94aa13b06 add ruby 2.0 to travis 2013-03-04 13:11:05 -05:00
David Dollar 4e84b92536 Merge pull request #327 from patheticpat/master
Fixed a typo in cli options description
2013-02-14 06:23:57 -08:00
Michael Kaiser 6215f8b3db Fixed a typo in cli options description 2013-02-14 14:45:44 +01:00
David Dollar ba9167152c handled by mingw now 2013-01-14 08:21:40 -05:00
David Dollar f31ff18191 update docs 2013-01-14 08:19:40 -05:00
David Dollar c42110e438 update changelog 2013-01-14 08:19:31 -05:00
David Dollar 26bb0ed54e 0.61.0 2013-01-14 08:18:05 -05:00
David Dollar 44002953f6 Merge pull request #277 from pcasaretto/add-timeout-switch
Add timeout switch to CLI - fixes #178
2013-01-14 05:12:12 -08:00
David Dollar bb2c3a2d04 Merge pull request #264 from asanghi/master
shared_path is set in documentation leading to early evaluation
2013-01-14 05:10:47 -08:00
David Dollar 88cdaacc67 Merge pull request #258 from mclazarus/master
Don't quote shell escaped values.
2013-01-14 05:10:36 -08:00
David Dollar faf7b3c40f Merge pull request #279 from evanj/master
Fix --directory option: its actually --root
2013-01-14 05:10:11 -08:00
David Dollar 21dd610eaf Merge pull request #280 from BIAINC/windows/host-support
Strip Windows Line Endings
2013-01-14 05:10:01 -08:00
David Dollar fe65c7510d Merge pull request #288 from crohr/remove-rubygems-requirement
Remove explicit requirement on rubygems.
2013-01-14 05:08:27 -08:00
David Dollar cd2c255296 Merge pull request #291 from liveh2o/master
JRuby 1.9 doesn't require posix/spawn
2013-01-14 05:08:10 -08:00
David Dollar 92c1909217 Merge pull request #300 from mattv/output-blank-lines
Don't ignore blank lines in the output
2013-01-14 05:07:31 -08:00
David Dollar af57bf3d52 Merge pull request #302 from ctrochalakis/process_group_fix
Ensure foreman is the process group leader
2013-01-14 05:07:21 -08:00
David Dollar 443994d3b5 Merge pull request #303 from fxposter/master
Fix for high CPU load. Fixes #260 and #299.
2013-01-14 05:06:44 -08:00
David Dollar 2faa3fb6ff Merge pull request #313 from sonots/fix_color
Fix color bug: not intense_cyan but bright_cyan
2013-01-14 05:02:52 -08:00
nseo 0d53f6bd6c fix more 2013-01-13 22:10:12 +09:00
nseo 1d2bcdbc56 fix color 2013-01-12 01:10:25 +09:00
Pavel Forkert aceea1472a Fix #299 and #260
Some processes close their output channels and IO.select keeps
returning them as "readable", while IO#gets returns nil on them, thus
spending a lot of CPU looping through the same reader continuously
2013-01-07 02:30:56 +02:00
Christos Trochalakis 44726e377e Ensure foreman is the process group leader
Foreman should be the process leader before killing processes using
his process group id.

Before that foreman was broken when it was not spawned from a shell.
2012-12-27 15:47:02 +02:00
Matt Venables 61eca5a1d8 Don't ignore blank lines in the output
This fixes the stdout code to ensure that empty lines are outputted.
Many times, these blank lines are intentional, so foreman should not
suppress them.

This fixes #286
2012-12-21 11:12:52 -05:00
David Dollar 553ac7f81f Merge pull request #295 from petedmarsh/master
Add license to gemspec
2012-12-03 05:56:14 -08:00
petedmarsh 6790cf02a9 Add license to gemspec 2012-12-03 13:52:27 +00:00
Adam Hutchison 7ad41da592 Since JRuby 1.9 doesn't require posix/spawn, only follow that path if JRuby is loaded and running in 1.8 mode. 2012-11-27 22:07:50 -07:00
Cyril Rohr 8ee7b7afdf Remove explicit requirement on rubygems.
It's better to not force the use of a package manager. Better to add it
to the global RUBYOPT if needed. Also, this fixes a dependency issue
when using the .deb package (rubygems1.9.1 is not required, and should
not be).
2012-11-12 21:10:10 +01:00
Aditya Sanghi 2620b90808 Dont use shared_path variable before multistage has a chance at it 2012-11-02 14:04:27 +05:30
Paul Morton 89bdc3ab8e Strip Windows Line Endings 2012-10-18 09:28:39 -07:00
Evan Jones 60a11eb981 Fix man page: --directory is actually --root. 2012-10-18 11:48:50 -04:00
Paulo Luis Franchini Casaretto 61c222deb8 Add timeout switch to CLI 2012-10-17 16:05:10 -03:00
David Dollar 8fe86e98c8 update docs 2012-10-08 10:47:40 -04:00
David Dollar 5c1ffdb7dc changelog 2012-10-08 10:47:21 -04:00
Kevin McAllister 8fbee31a2d Remove expectation of double quotes around environment variables from
test comparisons
2012-09-14 21:33:57 -04:00
Kevin McAllister 7b4eabf0c5 Remove explicit wrapping of Shellwords.escape in double quotes
According to http://www.ruby-doc.org/stdlib-1.9.3/libdoc/shellwords/rdoc/Shellwords.html#method-c-shellescape

"Note that a resulted string should be used unquoted and is not
intended for use in double quotes nor in single quotes."
2012-09-14 21:33:57 -04:00
22 changed files with 175 additions and 53 deletions
+1
View File
@@ -18,4 +18,5 @@ notifications:
rvm: rvm:
- 1.9.2 - 1.9.2
- 1.9.3 - 1.9.3
- 2.0.0
- jruby - jruby
+21
View File
@@ -1,3 +1,24 @@
## 0.61.0 (2013-01-14)
* 0.61.0 [David Dollar]
* Fix bug in color definitons [nseo]
* Fix for high CPU load when processes close output [Pavel Forkert]
* Ensure foreman is the process group leader [Christos Trochalakis]
* Don't ignore blank lines in the output [Matt Venables]
* Add license to gemspec [petedmarsh]
* Since JRuby 1.9 doesn't require posix/spawn, only follow that path if JRuby is loaded and running in 1.8 mode. [Adam Hutchison]
* Remove explicit requirement on rubygems. [Cyril Rohr]
* Dont use shared_path variable before multistage has a chance at it [Aditya Sanghi]
* Strip Windows Line Endings [Paul Morton]
* Fix man page: --directory is actually --root. [Evan Jones]
* Add timeout switch to CLI [Paulo Luis Franchini Casaretto]
* Remove expectation of double quotes around environment variables from test comparisons [Kevin McAllister]
* Remove explicit wrapping of Shellwords.escape in double quotes [Kevin McAllister]
## 0.60.2 (2012-10-08)
* Fix for nil value on io select loop, fixes #260 [Silvio Relli]
## 0.60.1 (2012-10-08) ## 0.60.1 (2012-10-08)
* sleep on select() to avoid spinning the cpu [Silvio Relli] * sleep on select() to avoid spinning the cpu [Silvio Relli]
+1 -1
View File
@@ -1,7 +1,7 @@
PATH PATH
remote: . remote: .
specs: specs:
foreman (0.60.2) foreman (0.62.0)
thor (>= 0.13.6) thor (>= 0.13.6)
GEM GEM
-16
View File
@@ -1,16 +0,0 @@
file pkg("foreman-#{version}-x86-mswin32.gem") => distribution_files do |t|
Bundler.with_clean_env do
sh "env PLATFORM=mswin32 gem build foreman.gemspec"
end
sh "mv foreman-#{version}-x86-mswin32.gem #{t.name}"
end
task "mswin32:build" => pkg("foreman-#{version}-x86-mswin32.gem")
task "mswin32:clean" do
clean pkg("foreman-#{version}-x86-mswin32.gem")
end
task "mswin32:release" => "mswin32:build" do |t|
sh "gem push #{pkg("foreman-#{version}-x86-mswin32.gem")} || echo 'error'"
end
+1
View File
@@ -3,6 +3,7 @@ require "foreman/version"
Gem::Specification.new do |gem| Gem::Specification.new do |gem|
gem.name = "foreman" gem.name = "foreman"
gem.license = "MIT"
gem.version = Foreman::VERSION gem.version = Foreman::VERSION
gem.author = "David Dollar" gem.author = "David Dollar"
+2 -2
View File
@@ -8,8 +8,8 @@ module Foreman
File.expand_path("../../bin/foreman-runner", __FILE__) File.expand_path("../../bin/foreman-runner", __FILE__)
end end
def self.jruby? def self.jruby_18?
defined?(RUBY_PLATFORM) and RUBY_PLATFORM == "java" defined?(RUBY_PLATFORM) and RUBY_PLATFORM == "java" and ruby_18?
end end
def self.ruby_18? def self.ruby_18?
+1 -1
View File
@@ -12,7 +12,7 @@ if defined?(Capistrano)
set :foreman_procfile, "Procfile" set :foreman_procfile, "Procfile"
set :foreman_app, application set :foreman_app, application
set :foreman_user, user set :foreman_user, user
set :foreman_log, "#{shared_path}/log" set :foreman_log, 'shared_path/log'
set :foreman_concurrency, false set :foreman_concurrency, false
DESC DESC
task :export, :roles => :app do task :export, :roles => :app do
+1
View File
@@ -23,6 +23,7 @@ class Foreman::CLI < Thor
method_option :env, :type => :string, :aliases => "-e", :desc => "Specify an environment file to load, defaults to .env" method_option :env, :type => :string, :aliases => "-e", :desc => "Specify an environment file to load, defaults to .env"
method_option :formation, :type => :string, :aliases => "-m", :banner => '"alpha=5,bar=3"' method_option :formation, :type => :string, :aliases => "-m", :banner => '"alpha=5,bar=3"'
method_option :port, :type => :numeric, :aliases => "-p" method_option :port, :type => :numeric, :aliases => "-p"
method_option :timeout, :type => :numeric, :aliases => "-t", :desc => "Specify the amount of time (in seconds) processes have to shutdown gracefully before receiving a SIGKILL, defaults to 5."
class << self class << self
# Hackery. Take the run method away from Thor so that we can redefine it. # Hackery. Take the run method away from Thor so that we can redefine it.
+129 -12
View File
@@ -9,6 +9,10 @@ require "thread"
class Foreman::Engine class Foreman::Engine
# The signals that the engine cares about.
#
HANDLED_SIGNALS = [ :TERM, :INT, :HUP ]
attr_reader :env attr_reader :env
attr_reader :options attr_reader :options
attr_reader :processes attr_reader :processes
@@ -25,6 +29,7 @@ class Foreman::Engine
@options = options.dup @options = options.dup
@options[:formation] ||= (options[:concurrency] || "all=1") @options[:formation] ||= (options[:concurrency] || "all=1")
@options[:timeout] ||= 5
@env = {} @env = {}
@mutex = Mutex.new @mutex = Mutex.new
@@ -32,15 +37,25 @@ class Foreman::Engine
@processes = [] @processes = []
@running = {} @running = {}
@readers = {} @readers = {}
# Self-pipe for deferred signal-handling (ala djb: http://cr.yp.to/docs/selfpipe.html)
reader, writer = create_pipe
reader.close_on_exec = true if reader.respond_to?(:close_on_exec)
writer.close_on_exec = true if writer.respond_to?(:close_on_exec)
@selfpipe = { :reader => reader, :writer => writer }
# Set up a global signal queue
# http://blog.rubybestpractices.com/posts/ewong/016-Implementing-Signal-Handlers.html
Thread.main[:signal_queue] = []
end end
# Start the processes registered to this +Engine+ # Start the processes registered to this +Engine+
# #
def start def start
trap("TERM") { puts "SIGTERM received"; terminate_gracefully } # Make sure foreman is the process group leader.
trap("INT") { puts "SIGINT received"; terminate_gracefully } Process.setpgrp unless Foreman.windows?
trap("HUP") { puts "SIGHUP received"; terminate_gracefully } if ::Signal.list.keys.include? 'HUP'
register_signal_handlers
startup startup
spawn_processes spawn_processes
watch_for_output watch_for_output
@@ -49,6 +64,74 @@ class Foreman::Engine
shutdown shutdown
end end
# Set up deferred signal handlers
#
def register_signal_handlers
HANDLED_SIGNALS.each do |sig|
if ::Signal.list.include? sig.to_s
trap(sig) { Thread.main[:signal_queue] << sig ; notice_signal }
end
end
end
# Unregister deferred signal handlers
#
def restore_default_signal_handlers
HANDLED_SIGNALS.each do |sig|
trap(sig, :DEFAULT) if ::Signal.list.include? sig.to_s
end
end
# Wake the main thread up via the selfpipe when there's a signal
#
def notice_signal
@selfpipe[:writer].write_nonblock( '.' )
rescue Errno::EAGAIN
# Ignore writes that would block
rescue Errno::EINT
# Retry if another signal arrived while writing
retry
end
# Invoke the real handler for signal +sig+. This shouldn't be called directly
# by signal handlers, as it might invoke code which isn't re-entrant.
#
# @param [Symbol] sig the name of the signal to be handled
#
def handle_signal(sig)
case sig
when :TERM
handle_term_signal
when :INT
handle_interrupt
when :HUP
handle_hangup
else
system "unhandled signal #{sig}"
end
end
# Handle a TERM signal
#
def handle_term_signal
puts "SIGTERM received"
terminate_gracefully
end
# Handle an INT signal
#
def handle_interrupt
puts "SIGINT received"
terminate_gracefully
end
# Handle a HUP signal
#
def handle_hangup
puts "SIGHUP received"
terminate_gracefully
end
# Register a process to be run by this +Engine+ # Register a process to be run by this +Engine+
# #
# @param [String] name A name for this process # @param [String] name A name for this process
@@ -94,11 +177,11 @@ class Foreman::Engine
end end
end end
# Send a signal to all processesstarted by this +Engine+ # Send a signal to all processes started by this +Engine+
# #
# @param [String] signal The signal to send to each process # @param [String] signal The signal to send to each process
# #
def killall(signal="SIGTERM") def kill_children(signal="SIGTERM")
if Foreman.windows? if Foreman.windows?
@running.each do |pid, (process, index)| @running.each do |pid, (process, index)|
system "sending #{signal} to #{name_for(pid)} at pid #{pid}" system "sending #{signal} to #{name_for(pid)} at pid #{pid}"
@@ -109,7 +192,22 @@ class Foreman::Engine
end end
else else
begin begin
Process.kill "-#{signal}", Process.pid Process.kill signal, *@running.keys unless @running.empty?
rescue Errno::ESRCH, Errno::EPERM
end
end
end
# Send a signal to the whole process group.
#
# @param [String] signal The signal to send
#
def killall(signal="SIGTERM")
if Foreman.windows?
kill_children(signal)
else
begin
Process.kill "-#{signal}", Process.getpgrp
rescue Errno::ESRCH, Errno::EPERM rescue Errno::ESRCH, Errno::EPERM
end end
end end
@@ -273,10 +371,28 @@ private
Thread.new do Thread.new do
begin begin
loop do loop do
io = IO.select(@readers.values, nil, nil, 30) io = IO.select([@selfpipe[:reader]] + @readers.values, nil, nil, 30)
begin
@selfpipe[:reader].read_nonblock(11)
rescue Errno::EAGAIN, Errno::EINTR => err
# ignore
end
# Look for any signals that arrived and handle them
while sig = Thread.main[:signal_queue].shift
self.handle_signal(sig)
end
(io.nil? ? [] : io.first).each do |reader| (io.nil? ? [] : io.first).each do |reader|
data = reader.gets next if reader == @selfpipe[:reader]
output_with_mutex name_for(@readers.invert[reader]), data
if reader.eof?
@readers.delete_if { |key, value| value == reader }
else
data = reader.gets
output_with_mutex name_for(@readers.invert[reader]), data
end
end end
end end
rescue Exception => ex rescue Exception => ex
@@ -297,15 +413,16 @@ private
def terminate_gracefully def terminate_gracefully
return if @terminating return if @terminating
restore_default_signal_handlers
@terminating = true @terminating = true
if Foreman.windows? if Foreman.windows?
system "sending SIGKILL to all processes" system "sending SIGKILL to all processes"
killall "SIGKILL" kill_children "SIGKILL"
else else
system "sending SIGTERM to all processes" system "sending SIGTERM to all processes"
killall "SIGTERM" kill_children "SIGTERM"
end end
Timeout.timeout(5) do Timeout.timeout(options[:timeout]) do
watch_for_termination while @running.length > 0 watch_for_termination while @running.length > 0
end end
rescue Timeout::Error rescue Timeout::Error
+4 -4
View File
@@ -44,8 +44,8 @@ class Foreman::Engine::CLI < Foreman::Engine
end end
FOREMAN_COLORS = %w( cyan yellow green magenta red blue intense_cyan intense_yellow FOREMAN_COLORS = %w( cyan yellow green magenta red blue bright_cyan bright_yellow
intense_green intense_magenta intense_red, intense_blue ) bright_green bright_magenta bright_red bright_blue )
def startup def startup
@colors = map_colors @colors = map_colors
@@ -54,7 +54,7 @@ class Foreman::Engine::CLI < Foreman::Engine
end end
def output(name, data) def output(name, data)
data.to_s.chomp.split("\n").each do |message| data.to_s.lines.map(&:chomp).each do |message|
output = "" output = ""
output += $stdout.color(@colors[name.split(".").first].to_sym) output += $stdout.color(@colors[name.split(".").first].to_sym)
output += "#{Time.now.strftime("%H:%M:%S")} #{pad_process_name(name)} | " output += "#{Time.now.strftime("%H:%M:%S")} #{pad_process_name(name)} | "
@@ -89,7 +89,7 @@ private
@names.values.each_with_index do |name, index| @names.values.each_with_index do |name, index|
colors[name] = FOREMAN_COLORS[index % FOREMAN_COLORS.length] colors[name] = FOREMAN_COLORS[index % FOREMAN_COLORS.length]
end end
colors["system"] = "intense_white" colors["system"] = "bright_white"
colors colors
end end
+1 -1
View File
@@ -5,7 +5,7 @@ class Foreman::Env
attr_reader :entries attr_reader :entries
def initialize(filename) def initialize(filename)
@entries = File.read(filename).split("\n").inject({}) do |ax, line| @entries = File.read(filename).gsub("\r\n","\n").split("\n").inject({}) do |ax, line|
if line =~ /\A([A-Za-z_0-9]+)=(.*)\z/ if line =~ /\A([A-Za-z_0-9]+)=(.*)\z/
key = $1 key = $1
case val = $2 case val = $2
+1 -1
View File
@@ -91,7 +91,7 @@ private ######################################################################
end end
def shell_quote(value) def shell_quote(value)
'"' + Shellwords.escape(value) + '"' Shellwords.escape(value)
end end
# deprecated # deprecated
+1 -2
View File
@@ -1,5 +1,4 @@
require "foreman" require "foreman"
require "rubygems"
class Foreman::Process class Foreman::Process
@@ -53,7 +52,7 @@ class Foreman::Process
Dir.chdir(cwd) do Dir.chdir(cwd) do
Process.spawn env, expanded_command(env), :out => output, :err => output Process.spawn env, expanded_command(env), :out => output, :err => output
end end
elsif Foreman.jruby? elsif Foreman.jruby_18?
require "posix/spawn" require "posix/spawn"
wrapped_command = "#{Foreman.runner} -d '#{cwd}' -p -- #{command}" wrapped_command = "#{Foreman.runner} -d '#{cwd}' -p -- #{command}"
POSIX::Spawn.spawn env, wrapped_command, :out => output, :err => output POSIX::Spawn.spawn env, wrapped_command, :out => output, :err => output
+1 -1
View File
@@ -82,7 +82,7 @@ class Foreman::Procfile
private private
def parse(filename) def parse(filename)
File.read(filename).split("\n").map do |line| File.read(filename).gsub("\r\n","\n").split("\n").map do |line|
if line =~ /^([A-Za-z0-9_]+):\s*(.+)$/ if line =~ /^([A-Za-z0-9_]+):\s*(.+)$/
[$1, $2] [$1, $2]
end end
+1 -1
View File
@@ -1,5 +1,5 @@
module Foreman module Foreman
VERSION = "0.60.2" VERSION = "0.62.0"
end end
+2 -2
View File
@@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3 .\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3
. .
.TH "FOREMAN" "1" "August 2012" "Foreman 0.60.1" "Foreman Manual" .TH "FOREMAN" "1" "January 2013" "Foreman 0.61.0" "Foreman Manual"
. .
.SH "NAME" .SH "NAME"
\fBforeman\fR \- manage Procfile\-based applications \fBforeman\fR \- manage Procfile\-based applications
@@ -90,7 +90,7 @@ Specify the user the application should be run as\. Defaults to the app name
These options control all modes of foreman\'s operation\. These options control all modes of foreman\'s operation\.
. .
.TP .TP
\fB\-d\fR, \fB\-\-directory\fR \fB\-d\fR, \fB\-\-root\fR
Specify an alternate application root\. This defaults to the directory containing the Procfile\. Specify an alternate application root\. This defaults to the directory containing the Procfile\.
. .
.TP .TP
+1 -1
View File
@@ -84,7 +84,7 @@ The following options control how the application is run:
These options control all modes of foreman's operation. These options control all modes of foreman's operation.
* `-d`, `--directory`: * `-d`, `--root`:
Specify an alternate application root. This defaults to the directory Specify an alternate application root. This defaults to the directory
containing the Procfile. containing the Procfile.
+1 -1
View File
@@ -38,7 +38,7 @@ describe Foreman::Export::Upstart, :fakefs do
engine.env['KEY'] = 'd"\|d' engine.env['KEY'] = 'd"\|d'
upstart.export upstart.export
"foobarfoo".should include "bar" "foobarfoo".should include "bar"
File.read("/tmp/init/app-alpha-1.conf").should =~ /KEY="d\\"\\\\\\\|d/ File.read("/tmp/init/app-alpha-1.conf").should =~ /KEY=d\\"\\\\\\\|d/
end end
context "with a formation" do context "with a formation" do
+1 -1
View File
@@ -41,7 +41,7 @@ describe Foreman::Process do
it "should output utf8 properly" do it "should output utf8 properly" do
process = Foreman::Process.new(resource_path("bin/utf8")) process = Foreman::Process.new(resource_path("bin/utf8"))
run(process).should == "\xFF\x03\n" run(process).should == "\xFF\x03\n".force_encoding('binary')
end end
end end
@@ -8,7 +8,7 @@ stdout_logfile=/var/log/app/alpha-1.log
stderr_logfile=/var/log/app/alpha-1.error.log stderr_logfile=/var/log/app/alpha-1.error.log
user=app user=app
directory=/tmp/app directory=/tmp/app
environment=PORT="5000" environment=PORT=5000
[program:app-bravo-1] [program:app-bravo-1]
command=./bravo command=./bravo
autostart=true autostart=true
@@ -18,7 +18,7 @@ stdout_logfile=/var/log/app/bravo-1.log
stderr_logfile=/var/log/app/bravo-1.error.log stderr_logfile=/var/log/app/bravo-1.error.log
user=app user=app
directory=/tmp/app directory=/tmp/app
environment=PORT="5100" environment=PORT=5100
[group:app] [group:app]
programs=app-alpha-1,app-bravo-1 programs=app-alpha-1,app-bravo-1
@@ -8,7 +8,7 @@ stdout_logfile=/var/log/app/alpha-1.log
stderr_logfile=/var/log/app/alpha-1.error.log stderr_logfile=/var/log/app/alpha-1.error.log
user=app user=app
directory=/tmp/app directory=/tmp/app
environment=PORT="5000" environment=PORT=5000
[program:app-alpha-2] [program:app-alpha-2]
command=./alpha command=./alpha
autostart=true autostart=true
@@ -18,7 +18,7 @@ stdout_logfile=/var/log/app/alpha-2.log
stderr_logfile=/var/log/app/alpha-2.error.log stderr_logfile=/var/log/app/alpha-2.error.log
user=app user=app
directory=/tmp/app directory=/tmp/app
environment=PORT="5001" environment=PORT=5001
[group:app] [group:app]
programs=app-alpha-1,app-alpha-2 programs=app-alpha-1,app-alpha-2
-2
View File
@@ -1,5 +1,3 @@
require "rubygems"
require "simplecov" require "simplecov"
SimpleCov.start do SimpleCov.start do
add_filter "/spec/" add_filter "/spec/"