Giter Site home page Giter Site logo

foreman's Introduction

Foreman

CI

Manage Procfile-based applications

Installation

$ gem install foreman

Ruby users should take care not to install foreman in their project's Gemfile. See this wiki article for more details.

Getting Started

Supported Ruby versions

See ci.yml for a list of Ruby versions against which Foreman is tested.

Documentation

Ports

Authors

Created and maintained by

David Dollar

Patches contributed by

Contributor List

License

Foreman is licensed under the MIT license.

See LICENSE for the full license text.

foreman's People

Contributors

acmacalister avatar amasses avatar betamatt avatar bfulton avatar botandrose-machine avatar clowder avatar csquared avatar ddollar avatar formigarafa avatar ged avatar kjwierenga avatar koenpunt avatar kovyrin avatar krissi avatar l1n avatar ldmosquera avatar lukaszkorecki avatar martinisoft avatar mishina2228 avatar nicklamuro avatar nicolai86 avatar njam avatar olleolleolle avatar phemmer avatar rasky avatar robindaugherty avatar silviorelli avatar technomancy avatar terceiro avatar timurb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

foreman's Issues

Foreman with Capistrano Deployment issue

I am using Foreman with Capistrano for deployment. Our server is using Ubuntu, so I am trying to integrate it with upstart. And I encountered some permission issue and try to find out what is the best way to deal with.

I use a non root user (passenger user) for capistrano deployment, so the root user does not have all the necessary env like ruby 1.9.2, bundle and etc. The upstart conf file generated by foreman export looks like this:

start on starting goldfish-scheduler
stop on stopping goldfish-scheduler
respawn

exec su - passenger -c 'cd /var/www/goldfish/releases/20110902114503; export PORT=5000; bundle exec clockwork app/clock.rb >> /var/www/goldfish/releases/20110902114503/log/foreman/scheduler-1.log 2>&1

So when it tries to start this service, it complains about cannot find command bundle. For this case, what is the best way to deal with it? Do I have to deploy as root user to make everything easier?

Thanks!

foreman exits immediately

Hi,

I'm playing around with foreman to use it in my development process. When I use it to export to upstart, everything seems to be working just fine:

root@tkral-wsl:/dev/samples/dataloader[develop]$ foreman export upstart /etc/init --user tkral
[foreman export] cleaning up: /etc/init/dataloader-web-1.conf
[foreman export] cleaning up: /etc/init/dataloader-web.conf
[foreman export] cleaning up: /etc/init/dataloader.conf
[foreman export] writing: /etc/init/dataloader.conf
[foreman export] writing: /etc/init/dataloader-web.conf
[foreman export] writing: /etc/init/dataloader-web-1.conf
root@tkral-wsl:
/dev/samples/dataloader[develop]$ start dataloader
dataloader start/running
root@tkral-wsl:~/dev/samples/dataloader[develop]$ status dataloader
dataloader start/running

However, when I use foreman start, the child process is exiting immediately:

root@tkral-wsl:~/dev/samples/dataloader[develop]$ foreman start
11:07:10 web.1 | started with pid 20780
11:07:10 web.1 | process exiting
11:07:10 web.1 | process terminated
11:07:10 system | sending SIGTERM to all processes

I'm a newbie when it comes to Ruby so I'm not sure if I have everything setup correctly (especially with PTY). Is there any way for me to test my environment or at least get more information to try to debug this?

Thanks.
-Tim

Process Monitoring in Production

Thanks for the awesome gem. Really simplifies and speeds up things in development!

This would really be great to use in production, but I was wondering what methods you use to monitor your processes. Currently my web apps all use either Heroku or a VPS. When I use a VPS I end up using Bluepill, an alternative to God and Monit.

As far as I can see when a Foreman-forked process dies (because it crashes or for whatever other reason) then it won't be re-spawned automatically. Also when a process reaches a certain memory consumption level, I'd like to restart that process.

Using Foreman in production, how would you go about monitoring a bunch of different processes in this way? Could you use something like Bluepill in combination with Foreman? Or are you planning to add such functionality to Foreman?

The Unicorn app server for example has a master process which spawns child processes. When a child process dies, the master process forks off a new one, so in a way it's its own little process monitor, except that I believe it only handles "spawning", not "re-spawning" or "stopping", you must leave that up to Bluepill, God, Monit or similar utilities.

Shutdown an application launched with bundle exec

Hi,

I' using foreman 0.18.0 and it seems that it can't stop an application launched with bundle exec.

Example:

$ cat Procfile
rails: bundle exec rails server thin
$ foreman start
15:25:36 rails.1   | started with pid 25455
15:25:41 rails.1   | => Booting Thin
15:25:41 rails.1   | => Rails 3.1.0.rc4 application starting in development on http://0.0.0.0:3000
15:25:41 rails.1   | => Call with -d to detach
15:25:41 rails.1   | => Ctrl-C to shutdown server
15:25:44 rails.1   | >> Thin web server (v1.2.11 codename Bat-Shit Crazy)
15:25:44 rails.1   | >> Maximum connections set to 1024
15:25:44 rails.1   | >> Listening on 0.0.0.0:3000, CTRL+C to stop
^CSIGINT received
15:25:50 system    | sending SIGTERM to all processes
15:25:53 system    | sending SIGKILL to all processes
15:25:53 rails.1   | process terminated
15:25:53 system    | sending SIGTERM to all processes
$ ps aux | grep rails
nono     25458 29.1  2.1  49772 43492 ?        Ssl  15:25   0:08 /home/nono/.rvm/rubies/ruby-head/bin/ruby script/rails server thin
nono     25490  0.0  0.0   4164   856 pts/4    S+   15:26   0:00 grep --color rails
$ foreman start      
15:26:21 rails.1   | started with pid 25500
15:26:27 rails.1   | NOTE: Gem.available? is deprecated, use Specification::find_by_name. It will be removed on or after 2011-11-01.
15:26:27 rails.1   | Gem.available? called from /home/nono/.rvm/gems/ruby-head/gems/jasmine-1.0.2.1/lib/jasmine/base.rb:64.
15:26:27 rails.1   | => Booting Thin
15:26:27 rails.1   | => Rails 3.1.0.rc4 application starting in development on http://0.0.0.0:3000
15:26:27 rails.1   | => Call with -d to detach
15:26:27 rails.1   | => Ctrl-C to shutdown server
15:26:30 rails.1   | >> Thin web server (v1.2.11 codename Bat-Shit Crazy)
15:26:30 rails.1   | >> Maximum connections set to 1024
15:26:30 rails.1   | >> Listening on 0.0.0.0:3000, CTRL+C to stop
15:26:30 rails.1   | Exiting
15:26:30 rails.1   | /home/nono/.rvm/gems/ruby-head/gems/eventmachine-0.12.10/lib/eventmachine.rb:572:in `start_tcp_server': no acceptor (RuntimeError)
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/eventmachine-0.12.10/lib/eventmachine.rb:572:in `start_server'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/thin-1.2.11/lib/thin/backends/tcp_server.rb:16:in `connect'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/thin-1.2.11/lib/thin/backends/base.rb:53:in `block in start'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `call'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/thin-1.2.11/lib/thin/backends/base.rb:61:in `start'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/thin-1.2.11/lib/thin/server.rb:159:in `start'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/rack-1.3.0/lib/rack/handler/thin.rb:13:in `run'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/rack-1.3.0/lib/rack/server.rb:265:in `start'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/railties-3.1.0.rc4/lib/rails/commands/server.rb:70:in `start'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/railties-3.1.0.rc4/lib/rails/commands.rb:54:in `block in <top (required)>'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/railties-3.1.0.rc4/lib/rails/commands.rb:49:in `tap'
15:26:30 rails.1   |    from /home/nono/.rvm/gems/ruby-head/gems/railties-3.1.0.rc4/lib/rails/commands.rb:49:in `<top (required)>'
15:26:30 rails.1   |    from script/rails:6:in `require'
15:26:30 rails.1   |    from script/rails:6:in `<main>'
/home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:117:in `eof?': Input/output error - /dev/pts/9 (Errno::EIO)
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:117:in `block (2 levels) in run'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:115:in `spawn'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:115:in `block in run'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:114:in `chdir'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:114:in `run'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:102:in `block in fork_individual'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:101:in `fork'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:101:in `fork_individual'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:91:in `block in fork'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:90:in `upto'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:90:in `fork'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:59:in `block in start'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:58:in `each'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/engine.rb:58:in `start'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/lib/foreman/cli.rb:23:in `start'
    from /home/nono/.rvm/gems/ruby-head/gems/thor-0.14.6/lib/thor/task.rb:22:in `run'
    from /home/nono/.rvm/gems/ruby-head/gems/thor-0.14.6/lib/thor/invocation.rb:118:in `invoke_task'
    from /home/nono/.rvm/gems/ruby-head/gems/thor-0.14.6/lib/thor.rb:263:in `dispatch'
    from /home/nono/.rvm/gems/ruby-head/gems/thor-0.14.6/lib/thor/base.rb:389:in `start'
    from /home/nono/.rvm/gems/ruby-head/gems/foreman-0.18.0/bin/foreman:7:in `<top (required)>'
    from /home/nono/.rvm/gems/ruby-head/bin/foreman:16:in `load'
    from /home/nono/.rvm/gems/ruby-head/bin/foreman:16:in `<main>'
15:26:30 rails.1   | process terminated
15:26:30 system    | sending SIGTERM to all processes

As you can see, the rails server thin is not stopped after the first foreman start and so fails on the second try. I think that foreman kills bundler but not thin. Do you think you can do something about it?

/usr/bin/env: foreman: No such file or directory

Well, when I try to export the upstart file, it says the following error:

$ rvmsudo foreman export upstart /etc/init -a myapp -u deploy -f ./Procfile.production
/usr/bin/env: foreman: No such file or directory

Problems with reading .env

I've put Google C2DM Token to env

C2DM_TOKEN=DQAAAMIAAAA6IeE_RqCsyldGd5-AcikntWVMtIpT3DDR2LJFGhasJMbJHLvtC_TyHQmqJymS-TqL-NjAwDFJkhO5V8iWqmRphSiNren-VdZf09tr8zAfl_Lb2WCyRvX95qjtoqNQS9gimFixKBio_50BzNNFmKNkY6pwI1tJIRrqHXrN1XMuPG-MRaD3jxkGKToITBLaOCq8Wu9PNmIdcHuUlHm-8tH6uS2nZfjBlFXPVNG-SaWlgmUyDqPrwFn5crnE5I1Z_FmX5Z2EpS4w3Y-aTwX8GkNr

For some reasons it is not loaded to ENV.

Windows-compatibility

Hi,

any plans making foreman compatible with Windows? Currently, you get a load error (due to pty library) when foreman is started...

Unused log dir

Foreman always creates a log dir, but it appears to be empty - is it used for anything? Prefer to not have it adding clutter to my projects.

Using foreman with Passenger standalone

We are using Phusion Passenger standalone in our dev environments. Without foreman, we start passenger with passenger start and stop it with ctrl-C.

It is important to note that passenger start starts two other processes to tail the log and the main nginx process whose pid is saved. Ctrl-C stops all of these. There is also a passenger stop command that will stop the nginx process using the saved pid.

I can't figure out how to simulate the manual ctrl-C with signals. A SIGINT to the passenger start process should work, but it doesn't. I have also tried SIGTERM. It looks like three SIGTERMs will stop it, but this sometimes leaves the tail process running and always leaves the nginx process. In this state, passenger stop will stop the nginx process.

We want to use foreman so that our background workers will be started too. The web line in our Procfile looks like:

web: passenger start

After I hit ctrl-C to stop foreman, it leaves all three passenger processes running. If I do a passegner stop, it stops the nginx process. This is all that is needed to successfully start foreman again, but I don't like the idea of leaving these unnecessary processes hanging around.

I think when I hit ctrl-C in foreman, it sends a SIGTERM to its children and they then send SIGTERM to our Procfile processes. After three seconds, it sends SIGKILL to its children.

Initially, I thought I just needed to add some hooks to foreman 0.17.0 to correctly stop passenger, so I added support to specify stop commands in the Procfile:

web_stop: passenger stop

I ran this command using Kernel.system in a stop_all method I called from terminate_gracefully before kill_all. This worked intermittently (sometimes leaving passenger processes running).

Then, I realized I should be adding this in the trap("SIGTERM") block in the run method and I should support a $PID that would be replaced with the Procfile process's pid. I added this to foreman 0.19.0. The Procfile now contains:

web_stop: kill $PID; passenger stop

This also doesn't seem to stop all the passenger processes.

Anyone have any thoughts on this?

Fork not available on JRuby

$ foreman start
/Users/adam/.rvm/gems/jruby-1.5.1/gems/foreman-0.7.1/lib/foreman/engine.rb:76:in `fork_individual': fork is unsafe and disabled by default on JRuby (NotImplementedError)
from /Users/adam/.rvm/gems/jruby-1.5.1/gems/foreman-0.7.1/lib/foreman/engine.rb:69:in `fork'

(This is after tweaking pty.rb as shown in this: http://jira.codehaus.org/browse/JRUBY-4962 - looks like it will be fixed in the next jruby release.)

Redis child process doesn't terminate

Using foreman to start up a project specific redis instance.

redis: redis-server ./config/redis.development.conf

It starts fine but doesn't get killed when I Ctrl-C foreman. I have daemonize no in the redis conf I'm giving it so it's not that. Looks like it might be related to issue #10

standalone foreman broken: foreman-runner

I think this just requires some repackaging. foreman-runner is still in the engine.rb that ships in the standalone:

      Dir.chdir directory do
        PTY.spawn(runner, process.command) do |stdin, stdout, pid|
          trap("SIGTERM") { Process.kill("SIGTERM", pid) }
          until stdin.eof?
            info stdin.gets, process
          end
        end
      end

However, this was allegedly deprecated in 20e598a. Basically, the standalone still wants to run the foreman-runner, but it's not packaged in the tgz, so something is amiss. Basically, nothing should ever work, unless someone has a copy of foreman-runner somehow.

foreman start only starts the first resource in the Procfile

This is my Procfile:

runner: bin/butler-runner --server thin --port 7890
workers: bundle exec resque-pool --daemon
resque_web: bundle exec resque-web --server thin --port 5678 --no-launch

Running foreman start:

ruby-1.9.2-p0@buyer Calista โžœ  butler git:(master) โœ— foreman start
12:54:52 runner.1      | started with pid 23661
12:54:52 workers.1     | started with pid 23662
12:54:52 resque_web.1  | started with pid 23664
12:54:54 runner.1      | [2011-03-09 12:54:54 +0000] Starting 'butler'...
12:54:54 runner.1      | [2011-03-09 12:54:54 +0000] trying port 7890...
12:54:54 resque_web.1  | process terminated
12:54:54 system        | terminating
12:54:54 system        | killing workers in pid 23662
12:54:54 system        | killing resque_web in pid 23664

Only the runner is up:

ruby-1.9.2-p0@buyer Calista โžœ  butler git:(master) โœ— ps aux | grep "[r]esque"
ruby-1.9.2-p0@buyer Calista โžœ  butler git:(master) โœ— ps aux | grep "[b]utler"
gerhard  23673   0.1  0.5  2488684  19536   ??  S    12:54pm   0:00.68 ruby bin/butler-runner --server thin --port 7890

Foreman stop

It would be nice on dev mode to have foreman stop.

json dependency causing bundler to fail

Resque has the dependency on json ~> 1.4.6 and foreman has json ~> 1.5.1. Any chance foreman could be changed to use 1.4.6 or greater until a new resque is out?

Here's the error:

Bundler could not find compatible versions for gem "json":
In Gemfile:
foreman (= 0.12.0) depends on
json (~> 1.5.1)

resque (= 1.15.0) depends on
  json (1.4.6)

foreman start does not handle SIGTERM correctly

I have encountered this issue in both Mac os X Lion and an ubuntu server (on which I was manually running foreman start).
I have the following over-simple Procfile

web:    export RAILS_ENV=production; bundle exec rails server thin -p $PORT
worker: export RAILS_ENV=production; bundle exec rake jobs:work

This produces a number of processes including rails s thin, which is managed by the parent process (the one launched by foreman start).

Then I just press CTRL-C, which stops foreman, but then I can observe the child process still running when inspecting it with ps -ef.

It looks like foreman is not properly SIGTERming its child processes when it is SIGTERMed itself.

Backgrounded process leads to stop foreman

Hi,

I am using rails 2.3.5 with one of my old project where lots of process are running with rails application.

Out of that, one of the command is "rake ts:start". Which start the sphinx server (Thinking-sphinx gem).

This command start sphinx daemon and come out on terminal.

Well but if I use it with foreman it start the all server but after starting sphinx server kill all servers and foreman also.

If I remove "rake ts:start" every thing is working fine.

Question Inittab: How-to?

Hi David,

I've been considering migrating to ArchLinux, and they use inittab instead of upstart. Foreman supports inittab, but I couldn't get it working on ArchLinux, simply because I have no clue how to run it.

Googling around only led to "upstart" examples on various blogs, but absolutely no one as far as I can see had any example/tutorial on how to get going with inittab instead of upstart.

Any chance you could provide just the basics of how to get up and running with Foreman and Inittab? I wasn't able to figure it out, though I am not really a linux guy, but i'd love to know how it works.

I believe that when you run foreman export inittab it prints out a line of code which you can paste in to the /etc/inittab file. But what's next? How do tell inittab to run that script?

What are the equivalent of Upstart's:

  • start myapp
  • stop myapp
  • restart myapp

in Inittab?

From the documentation it seems to be easy to add flags to the inittab config like respawn boot etc, but how do you manually invoke such scripts without having to reboot?

Any information much appreciated, thanks!

foreman with rvmsudo

Hey all.

on my dev machine (osx) i run my webserver with rvmsudo to get it listen on port 80:

web: rvmsudo rails s -p 80

Problem with foreman: It does not ask for my root password before it starts. Any solution around this?

I guess starting foreman with rvmsudo is not a solution....

Web process doesn't terminate with Thin 1.2.11

Breaking out of Foreman doesn't kill the web process with the latest version of Thin:

$ foreman start
12:18:36 web.1     | started with pid 55657
12:18:38 web.1     | == Sinatra/1.2.1 has taken the stage on 5000 for development with backup from Thin
12:18:38 web.1     | >> Thin web server (v1.2.11 codename Bat-Shit Crazy)
12:18:38 web.1     | >> Maximum connections set to 1024
12:18:38 web.1     | >> Listening on 0.0.0.0:5000, CTRL+C to stop
^C12:18:39 web.1     | process exiting
SIGINT received
12:18:39 system    | terminating
12:18:39 system    | killing web in pid 55657
12:18:39 web.1     | process terminated
12:18:39 system    | terminating
$ ps aux | grep ruby
adam     55659   0.1  0.3  2470300  26208   ??  S    12:18PM   0:01.63 ruby web.rb -p 5000

Switching back to Thin 1.2.7 removes this problem, so I'm guessing that the newer version forks differently.

Here's a sample app: https://gist.github.com/911691

Unclear Behavior Running Export Specs

This could be a bug, or I could just be doing something wrong.

In smith@d047f91 (on the https://github.com/smith/foreman/tree/supervisor branch), /spec/resources/export/supervisor/app-bravo.conf looks like this:

[program:app-bravo]
command=./bravo
directory=/tmp/app
process_name=%(program_name)-%(process_num)
num_procs=2
user=app

When running the specs I get this error:

1) Foreman::Export::Supervisor exports to the filesystem
 Failure/Error: File.read("/tmp/init/app-bravo.conf").should   == example_export_file("supervisor/app-bravo.conf")
   expected: "[program:app-bravo]\ncommand=./bravo\ndirectory=/tmp/app\nprocess_name=%(program_name)-%(process_num)\nnum_procs=2\nuser=app\n"
        got: "[program:app-bravo]\ncommand=./bravo\ndirectory=/tmp/app\nuser=app\n" (using ==)
   Diff:
   @@ -1,7 +1,5 @@
    [program:app-bravo]
    command=./bravo
    directory=/tmp/app
   -process_name=%(program_name)-%(process_num)
   -num_procs=2
    user=app
 # ./spec/foreman/export/supervisor_spec.rb:19:in `block (2 levels) in <top (required)>'

If I change it to look like this:

[program:app-bravo]
command=./bravo
directory=/tmp/app
user=app

I get this error:

1) Foreman::Export::Supervisor exports to the filesystem
 Failure/Error: File.read("/tmp/init/app-alpha.conf").should   == example_export_file("supervisor/app-alpha.conf")
   expected: "[program:app-alpha]\ncommand=./alpha\ndirectory=/tmp/app\nuser=app\n"
        got: "[program:app-alpha]\ncommand=./alpha\nprocess_name=%(program_name)-%(process_num)\nnum_procs=2\ndirectory=/tmp/app\nuser=app\n" (using ==)
   Diff:
   @@ -1,5 +1,7 @@
    [program:app-alpha]
    command=./alpha
   +process_name=%(program_name)-%(process_num)
   +num_procs=2
    directory=/tmp/app
    user=app
 # ./spec/foreman/export/supervisor_spec.rb:18:in `block (2 levels) in <top (required)>'

I'm having trouble figuring out where bravo does or does not set its concurrency to 2, since the expectation seems to change based on the contents of the file it's tested against. Could very well be a stupid bug in my code too. Any help would be appreciated.

postgres not properly exiting

Running postgres on OSX like:

postgres:   postgres -D /usr/local/var/postgres

When exiting foreman, postgres doesn't quit and I have to kill the process manually (using postgres 9.0.4 installed via homebrew). Is this a foreman issue?

More flexibility in declaring `ENV` variables?

Foreman can set the ENV for a process by reading a file when it is invoked. This is great but the limitation is that all processes wind up sharing the same ENV. I'd like a little more flexibility.

My app uses Resque and I'd like to write a Procfile like this:

worker_a: QUEUE=worker_a_queue rake resque:work
worker_b: QUEUE=worker_b_queue rake resque:work

Both processes share the same ENV except for just one variable, QUEUE. I could make this work by using two environment files, each with a different value of QUEUE, and invoking foreman with the -e flag depending on which process I wanted to run. This is duplicative for all the variables that are shared and it also seems to defeat the purpose of using Procfiles as I'd have to additionally document which process belonged to which environment file.

Implementing this would require changing the regexp used to parse Procfiles. Some more work would be required to properly pass the environment from where it is parsed to where the process is actually executed. All of this code lives in Foreman::Engine so hopefully this change could be fairly self-contained.

Foreman doesn't shut down gunicorn

Procfile:

web: python project/manage.py run_gunicorn 127.0.0.1:$PORT

uname -a

Linux lucid32 2.6.32-33-generic #70-Ubuntu SMP Thu Jul 7 21:09:46 UTC 2011 i686 GNU/Linux

ruby --version

ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]

Example session:

(application)application@lucid32:[project ~master *]$ ps aux | grep python
1001       820  0.0  0.1   2140   740 pts/1    S+   07:16   0:00 grep --color=auto python

(application)application@lucid32:[project ~master *]$ foreman start
07:16:07 web.1     | started with pid 835
07:16:07 web.1     | Validating models...
07:16:07 web.1     | 0 errors found
07:16:07 web.1     | 
07:16:07 web.1     | Django version 1.3.1, using settings 'project.settings'
07:16:07 web.1     | Server is running
07:16:07 web.1     | Quit the server with CONTROL-C.
07:16:07 web.1     | 2011-09-14 09:16:07 [837] [INFO] Starting gunicorn 0.13.1
07:16:07 web.1     | 2011-09-14 09:16:07 [837] [INFO] Listening at: http://127.0.0.1:5000 (837)
07:16:07 web.1     | 2011-09-14 09:16:07 [837] [INFO] Using worker: sync
07:16:07 web.1     | 2011-09-14 09:16:07 [840] [INFO] Booting worker with pid: 840
^CSIGINT received
07:16:11 system    | sending SIGTERM to all processes
07:16:11 web.1     | process exiting

(application)application@lucid32:[project ~master *]$ ps aux | grep python
1001       837  2.2  3.1  15548 11804 ?        S    07:16   0:00 python project/manage.py run_gunicorn 127.0.0.1:5000
1001       840  0.1  2.9  16432 11276 ?        S    07:16   0:00 python project/manage.py run_gunicorn 127.0.0.1:5000
1001       855  0.0  0.1   2140   736 pts/1    S+   07:16   0:00 grep --color=auto python

(application)application@lucid32:[project ~master *]$ 

Run on startup

I think it could be useful to have an option to make the exported scripts run on startup. For example, with upstart, have start on runlevel [2345].

unicorn doesn't stop running

I'm launching unicorn like this:

web: bundle exec unicorn -E development -c config/unicorn.rb

It starts up fine and serves requests, but when I kill foreman unicorn doesn't quit as expected. It keeps running (both master and child). Is there something special that has to happen for processes that launch other processes? Unicorn seems to respond to a kill.

With BUNDLE_GEMFILE env var

I was trying to add a command to start a custom server that is in the same rails3 app dir but with its own Gemfile.
The command is as:

socky-server: BUNDLE_GEMFILE=./socky-server/Gemfile bundle exec thin-websocket -R ./socky-server/config.ru -p3001 start

But it turns out that its not able to start or execute such command which run fine if executed in the terminal manually.

16:57:50 socky-server.1  | /Users/millisami/.rvm/gems/ruby-1.9.2-p180/gems/foreman-0.19.0/bin/foreman-runner:2:in `exec': No such file or directory - BUNDLE_GEMFILE=./socky-server/Gemfile bundle exec thin-websocket -R ./socky-server/config.ru -p3001 start (Errno::ENOENT)
16:57:50 socky-server.1  |  from /Users/millisami/.rvm/gems/ruby-1.9.2-p180/gems/foreman-0.19.0/bin/foreman-runner:2:in `<main>'

And if I put that BUNDLE_GEMFILE at the end, it tries to take the rails app's Gemfile into account?

unicorn does not start

I am running unicorn 3.6.2 and foreman 0.18.0 as follows

web: bundle exec unicorn -p $PORT -c config/unicorn.rb

instead I get this
/.rvm/gems/ruby-1.9.2-p180/gems/foreman-0.18.0/lib/foreman/engine.rb:49:in block in processes_in_order': undefined method[]' for nil:NilClass (NoMethodError

config/unicorn.rb has the following

worker_processes 4
timeout 40

Issue with log file cursor under Rails (and others?)

I'm seeing a constant problem with Foreman (sample app), where something in the background (classic case is Resque workers) which write to the Rails log cause on the first HTTP request, all log lines written to the file to be streamed via Foreman to the terminal.

This in itself isn't a /huge/ problem, except from the time it can take to catch up on millions of lines of logs, but that it also causes under iTerm2 (and others, I'm sure), broken escape codes, which in some cases put the terminal into Klingon (or, rather high-range unicode chars) or trigger it to display the print dialog (and pause), beep, clear the screen, etc, generally strange behavior.

I'm not really sure what the solution is, I'm not even completely sure how file cursors on logs work; or what foreman is doing to start Rails ( I assume it's actually /Rails/ which displays the log trace to Foreman, when something is written to it's logs behind the scenes.

I'm posting here, because this manifest most reliably and repeatably via Foreman, and because I suspect in a small project we'll be able to have a more constructive discussion before taking it upstream to Rails.

Steps to reproduce:

  1. Get the sample application
  2. Start foreman
  3. In another tab/term/panel: rails runner '1_000.times { |n| Widget.create!(:name => "Widget #{n}")}'
  4. (observe nothing visible via the foreman output / logs)
  5. open http://127.0.0.1:5000/widgets
  6. Observe ~1000 log lines screaming past
  7. Randomly, observe iTerm2's output breaking/etc

The same error is present in Rails, when using rails server; so this isn't exclusive to Foreman (and having written this ticket, and made the sample-app, I'm inclined to think I should have gone directly to rails/rails!)

I've mentioned iTerm2 a couple of times here; the issue being tracked upstream was [http://code.google.com/p/iterm2/issues/detail?id=352], in spite of the title of the ticket, please skim the comments, in the end log output displayed via Forman was show to have gotten out of sync, somehow, and escape codes, and parts of words, and colors were interleaved in the output, resulting in the erroneous codes.

Upstart export template and loading environments

It looks like the template used to export to upstart:

su [user] -c [command]

Uses the su command with the optional - flag to indicate that the environment should be loaded. If this was changed to

su - [user] -c [command]

It would load the environment. This is mostly in conjunction with the use of tools like RVM etc.

I'm happy to fork and send a pull request, however it's a minor (!) change.

Kernel Panic on foreman start?

I got twice a kernel panic right after running foreman start.

This is my Procfile:

memcached: memcached
solr:      sunspot-solr run --data-directory=./solr/data --solr-home=./solr --log-level=FINE
solrtest:  RAILS_ENV=test sunspot-solr run --data-directory=./solr/test_data/data --solr-home=./solr --log-level=FINE --port=8981
redit:     /usr/local/bin/redis-server

and if I run them separately they all work great.

After the foreman start I see te colored output and then it crashes the entire system, so I must restart. This is the crash log I get after the reboot:

Interval Since Last Panic Report:  1407050 sec
Panics Since Last Report:          2
Anonymous UUID:                    B370E883-1267-4351-AB4B-75FABACE6052

Wed Sep 14 12:24:18 2011
panic(cpu 2 caller 0xffffff8000328ae2): "Negative open count?"@/SourceCache/xnu/xnu-1699.22.81/bsd/miscfs/specfs/spec_vnops.c:1368
Backtrace (CPU 2), Frame : Return Address
0xffffff812d6dbc10 : 0xffffff8000220702 
0xffffff812d6dbc90 : 0xffffff8000328ae2 
0xffffff812d6dbcd0 : 0xffffff800032c885 
0xffffff812d6dbd20 : 0xffffff8000318ee4 
0xffffff812d6dbd60 : 0xffffff80002fd19a 
0xffffff812d6dbdb0 : 0xffffff80002fce9e 
0xffffff812d6dbdf0 : 0xffffff80002fe3c1 
0xffffff812d6dbe20 : 0xffffff8000316a0f 
0xffffff812d6dbe50 : 0xffffff8000540dc9 
0xffffff812d6dbec0 : 0xffffff800023b9db 
0xffffff812d6dbef0 : 0xffffff800023beda 
0xffffff812d6dbf20 : 0xffffff800023bf70 
0xffffff812d6dbf50 : 0xffffff800021e0ce 
0xffffff812d6dbf90 : 0xffffff80002c1caa 
0xffffff812d6dbfb0 : 0xffffff80002d7a0c 

BSD process name corresponding to current thread: ruby

Mac OS version:
11B26

Kernel version:
Darwin Kernel Version 11.1.0: Tue Jul 26 16:07:11 PDT 2011; root:xnu-1699.22.81~1/RELEASE_X86_64
Kernel UUID: D52AAB80-B2BC-3C6E-BBEA-78BD28064998
System model name: MacBookPro8,1 (Mac-94245B3640C91C81)

System uptime in nanoseconds: 38215858656
last loaded kext at 11176272136: com.apple.driver.AppleHWSensor 1.9.4d0 (addr 0xffffff7f81828000, size 28672)
loaded kexts:
com.Logitech.Control Center.HID Driver  3.3.0
com.apple.driver.AppleHWSensor  1.9.4d0
com.apple.filesystems.autofs    3.0
com.apple.driver.AppleMikeyHIDDriver    122
com.apple.driver.AppleTyMCEDriver   1.0.2d2
com.apple.driver.AppleHDA   2.1.1f12
com.apple.driver.AppleMikeyDriver   2.1.1f12
com.apple.driver.AGPM   100.12.40
com.apple.driver.AudioAUUC  1.59
com.apple.driver.AppleUpstreamUserClient    3.5.9
com.apple.driver.AppleMCCSControl   1.0.24
com.apple.driver.SMCMotionSensor    3.0.1d2
com.apple.iokit.IOUserEthernet  1.0.0d1
com.apple.Dont_Steal_Mac_OS_X   7.0.0
com.apple.driver.AudioIPCDriver 1.2.0
com.apple.driver.AppleSMCLMU    2.0.1d2
com.apple.driver.ACPI_SMC_PlatformPlugin    4.7.0b2
com.apple.driver.AppleLPC   1.5.1
com.apple.driver.AppleMuxControl    3.0.8
com.apple.driver.AppleBacklight 170.1.9
com.apple.driver.AppleIntelHDGraphics   7.0.4
com.apple.driver.AppleIntelSNBGraphicsFB    7.0.4
com.apple.driver.AppleUSBTCButtons  220.8
com.apple.driver.AppleUSBTCKeyEventDriver   220.8
com.apple.driver.AppleUSBTCKeyboard 220.8
com.apple.driver.AppleIRController  309
com.apple.iokit.SCSITaskUserClient  3.0.0
com.apple.AppleFSCompression.AppleFSCompressionTypeDataless 1.0.0d1
com.apple.AppleFSCompression.AppleFSCompressionTypeZlib 1.0.0d1
com.apple.BootCache 32
com.apple.iokit.IOAHCIBlockStorage  2.0.0
com.apple.driver.AppleUSBHub    4.4.0
com.apple.driver.AirPort.Brcm4331   511.20.10
com.apple.driver.AppleFWOHCI    4.8.6
com.apple.driver.AppleSmartBatteryManager   161.0.0
com.apple.driver.AppleEFINVRAM  1.5.0
com.apple.driver.AppleSDXC  1.1.0
com.apple.iokit.AppleBCM5701Ethernet    3.0.6b9
com.apple.driver.AppleAHCIPort  2.1.8
com.apple.driver.AppleUSBEHCI   4.4.0
com.apple.driver.AppleUSBUHCI   4.4.0
com.apple.driver.AppleACPIButtons   1.4
com.apple.driver.AppleRTC   1.4
com.apple.driver.AppleHPET  1.6
com.apple.driver.AppleSMBIOS    1.7
com.apple.driver.AppleACPIEC    1.4
com.apple.driver.AppleAPIC  1.5
com.apple.driver.AppleIntelCPUPowerManagementClient 166.0.0
com.apple.nke.applicationfirewall   3.0.30
com.apple.security.quarantine   1
com.apple.driver.AppleIntelCPUPowerManagement   166.0.0
com.apple.kext.triggers 1.0
com.apple.driver.AppleHDAHardwareConfigDriver   2.1.1f12
com.apple.driver.DspFuncLib 2.1.1f12
com.apple.driver.AppleAVBAudio  1.0.0d11
com.apple.driver.AppleSMBusController   1.0.10d0
com.apple.iokit.IOFireWireIP    2.2.3
com.apple.iokit.IOSurface   80.0
com.apple.iokit.IOBluetoothSerialManager    2.5f17
com.apple.iokit.IOSerialFamily  10.0.5
com.apple.iokit.IOAVBFamily 1.0.0d22
com.apple.iokit.IOAudioFamily   1.8.3fc11
com.apple.kext.OSvKernDSPLib    1.3
com.apple.driver.AppleHDAController 2.1.1f12
com.apple.iokit.IOHDAFamily 2.1.1f12
com.apple.driver.AppleSMC   3.1.1d2
com.apple.driver.IOPlatformPluginFamily 4.7.0b2
com.apple.driver.AppleSMBusPCI  1.0.10d0
com.apple.driver.AppleGraphicsControl   3.0.8
com.apple.driver.AppleBacklightExpert   1.0.3
com.apple.driver.AppleThunderboltEDMSink    1.1.1
com.apple.driver.AppleThunderboltEDMSource  1.1.1
com.apple.iokit.IONDRVSupport   2.3
com.apple.iokit.IOGraphicsFamily    2.3
com.apple.driver.AppleThunderboltDPOutAdapter   1.3.2
com.apple.driver.AppleThunderboltDPInAdapter    1.3.2
com.apple.driver.AppleThunderboltDPAdapterFamily    1.3.2
com.apple.driver.AppleThunderboltPCIDownAdapter 1.1.6
com.apple.driver.AppleFileSystemDriver  13
com.apple.driver.BroadcomUSBBluetoothHCIController  2.5f17
com.apple.driver.AppleUSBBluetoothHCIController 2.5f17
com.apple.iokit.IOBluetoothFamily   2.5f17
com.apple.driver.AppleUSBMultitouch 220.23
com.apple.iokit.IOUSBHIDDriver  4.4.0
com.apple.driver.AppleUSBMergeNub   4.4.0
com.apple.driver.AppleUSBComposite  3.9.0
com.apple.iokit.IOSCSIMultimediaCommandsDevice  3.0.0
com.apple.iokit.IOBDStorageFamily   1.6
com.apple.iokit.IODVDStorageFamily  1.6
com.apple.iokit.IOCDStorageFamily   1.7
com.apple.iokit.IOAHCISerialATAPI   2.0.0
com.apple.iokit.IOSCSIArchitectureModelFamily   3.0.0
com.apple.driver.XsanFilter 403
com.apple.driver.AppleThunderboltNHI    1.2.6
com.apple.iokit.IOThunderboltFamily 1.4.9
com.apple.iokit.IO80211Family   400.40
com.apple.iokit.IOUSBUserClient 4.4.0
com.apple.iokit.IOFireWireFamily    4.4.3
com.apple.iokit.IOEthernetAVBController 1.0.0d5
com.apple.iokit.IONetworkingFamily  2.0
com.apple.iokit.IOAHCIFamily    2.0.6
com.apple.iokit.IOUSBFamily 4.4.0
com.apple.driver.AppleEFIRuntime    1.5.0
com.apple.iokit.IOHIDFamily 1.7.0
com.apple.iokit.IOSMBusFamily   1.1
com.apple.security.sandbox  165
com.apple.kext.AppleMatch   1.0.0d1
com.apple.security.TMSafetyNet  7
com.apple.driver.DiskImages 326
com.apple.iokit.IOStorageFamily 1.7
com.apple.driver.AppleKeyStore  28.18
com.apple.driver.AppleACPIPlatform  1.4
com.apple.iokit.IOPCIFamily 2.6.5
com.apple.iokit.IOACPIFamily    1.4
Model: MacBookPro8,1, BootROM MBP81.0047.B0E, 2 processors, Intel Core i7, 2.7 GHz, 8 GB, SMC 1.68f96
Graphics: Intel HD Graphics 3000, Intel HD Graphics 3000, Built-In, 512 MB
Memory Module: BANK 0/DIMM0, 4 GB, DDR3, 1333 MHz, 0x80AD, 0x484D54333531533642465238432D48392020
Memory Module: BANK 1/DIMM0, 4 GB, DDR3, 1333 MHz, 0x80AD, 0x484D54333531533642465238432D48392020
AirPort: spairport_wireless_card_type_airport_extreme (0x14E4, 0xD6), Broadcom BCM43xx 1.0 (5.100.98.75.10)
Bluetooth: Version 2.5.0f17, 2 service, 19 devices, 1 incoming serial ports
Network Service: AirPort, AirPort, en1
Serial ATA Device: APPLE SSD TS256C, 251 GB
Serial ATA Device: MATSHITADVD-R   UJ-8A8
USB Device: FaceTime HD Camera (Built-in), apple_vendor_id, 0x8509, 0xfa200000 / 3
USB Device: hub_device, 0x0424  (SMSC), 0x2513, 0xfa100000 / 2
USB Device: Apple Internal Keyboard / Trackpad, apple_vendor_id, 0x0245, 0xfa120000 / 5
USB Device: BRCM2070 Hub, 0x0a5c  (Broadcom Corp.), 0x4500, 0xfa110000 / 4
USB Device: Bluetooth USB Host Controller, apple_vendor_id, 0x821a, 0xfa113000 / 7
USB Device: hub_device, 0x0424  (SMSC), 0x2513, 0xfd100000 / 2
USB Device: IR Receiver, apple_vendor_id, 0x8242, 0xfd110000 / 3

Run a process with sudo?

I just wanted to know how can I specify a process which requires root privileges and needs to run with sudo. I've tried it and it doesn't ask for the password. Any suggestion?

Thanks.

Using ruby-debug when running rails through foreman

Apologies, if this is a silly question, I may be grasping at straws here considering the more typical use cases for foreman.

I've recently started using foreman to manage the processes in my development environment. I'm happy with the setup, it allows me to run rails, sphinx, and delayed job together and kill them all without forgetting about one of them.

However, putting a "debugger" breakpoint in my ruby code and starting a debug console is a problem with this setup. The breakpoint does get hit because the web request hangs waiting to continue, but there is no interactive debug console on the foreman terminal.

Is it possible to get an interactive debug console while running rails through foreman in development?

I'm running rails 3.0.6, ruby 1.9.2 and foreman 0.19.0

How to specify environment?

I have started using Foreman in my app, and it's been great so far. I was wondering if there is a way to specify a RAILS_ENV as a paraemter inside Procfile? For example, when I start a delayed_job worker on production, I have to use:

RAILS_ENV=production script/delayed_job start

How can I access/set RAiLS_ENV within procfile?

Respecting relative files in process export

I have the following Procfile:


clock: bundle exec clockwork config/schedule.rb
urgent_worker: bundle exec stalk config/stalker_jobs.rb heartbeat
worker: bundle exec stalk config/stalker_jobs.rb

It exports to the following inittab:

# ----- foreman firstbargain processes -----
FI01:4:respawn:/bin/su - deploy -c 'PORT=5000 bundle exec clockwork config/schedule.rb >> /var/log/firstbargain/clock-1.log 2>&1'
FI02:4:respawn:/bin/su - deploy -c 'PORT=5100 bundle exec stalk config/stalker_jobs.rb heartbeat >> /var/log/firstbargain/urgent_worker-1.log 2>&1'
FI03:4:respawn:/bin/su - deploy -c 'PORT=5200 bundle exec stalk config/stalker_jobs.rb >> /var/log/firstbargain/worker-1.log 2>&1'
# ----- end foreman firstbargain processes -----

But the init tasks cannot fire because the files they point to, "config/stalker_jobs.rb" and the like, are relative pathnames. Perhaps the foreman export can take into account the current directory and export absolute filenames?

Unclear how .env should be interpreted

The man page states with respect to .env:

Specify a file containing the environment that should be set up for each
child process. The file should be key/value pairs separated by `=`, with
one key/value pair per line.

So .env should look something like:

FOO=bar
BAT=biz

And can be applying outside of Foreman with:

$ export $(cat .env)

Is this the preferred/canonical method for applying .env outside of Foreman? It is important to be able to do this in a reliable way to be able to run one-shot admin commands in a Foreman-supported app, such as bundle exec rake db:migrate. If this is the canonical method, is that worth documenting in the man page?

Foreman behaves differently than export $(cat .env) in at least on respect: handling of values with spaces. For example:

$ cat > .env
FOO=bar bat
$ export $(cat .env)
$ echo $FOO
bar

$ cat > say
#!/bin/bash
echo $FOO
$ chmod +x say
$ cat > Procfile
say: ./say
$ foreman start
11:15:58 say.1     | started with pid 35017
11:15:58 say.1     | bar bat
11:15:58 say.1     | process terminated

Is one or the other of these right? If it's export, should Foreman be adjusted to conform to its behavior?

I'm happy to write any doc or implementation patches necessary here, I just want to understand the desired design first.

Export Upstart commands are not working

After export to upstart and running this command

start testapp

I am getting this error

start: Job failed to start

I am using Ubuntu 10.4 LTS and logged in with root if it does matter.

Can't start foreman

I've set foreman to start all the processes which are needed for my aplication to work. Unfortunately I always have error from this gist https://gist.github.com/1183068

separately each of these processes work just fine

edit:
I notice that if I remove
solar: bundle exec rake sunspot:stopango_restart

foreman is working but still this task work if I run it in console

Terminating multiple times

When terminating, I see output like this:

18:33:49 system    | terminating
18:33:49 system    | killing worker in pid 29580
18:33:49 system    | killing client in pid 29587
18:33:49 system    | killing api in pid 29582
18:33:49 system    | killing nginx in pid 29577
18:33:49 system    | killing solr in pid 29578
18:33:49 client.1  | process terminated
18:33:49 system    | terminating
18:33:49 system    | killing worker in pid 29580
18:33:49 system    | killing api in pid 29582
18:33:49 system    | killing nginx in pid 29577
18:33:49 system    | killing solr in pid 29578

This is a result of the forking/killing/waiting behavior in foreman/engine.rb, where child processes (not just the master process) are also killing their siblings.

Generally, this isn't a big deal. However, some applications treat the first SIGTERM as "start shutting down", but treat the second SIGTERM as "OMG SHUT DOWN QUICKLY GO GO GO GO GO". I've been playing with this a bit and I am seeing cases where Thin, Nginx, and others hold open a port (in a sub-sub-process?) because they shutdown to aggressively.

I'd be willing to take a crack at a patch if anyone thinks they know what the correct solution is.

Also, as a workaround, I'm about to attempt a wrapper process that eats all but the first SIGTERM.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.