Class: Stable::Services::ProcessManager

Inherits:
Object
  • Object
show all
Defined in:
lib/stable/services/process_manager.rb

Overview

Service for managing application processes

Class Method Summary collapse

Class Method Details

.start(target) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/stable/services/process_manager.rb', line 7

def self.start(target)
  app = target.is_a?(String) ? AppRegistry.fetch(target) : target

  path = app[:path]
  port = app[:port]

  ruby = app[:ruby]
  gemset = Stable::Services::Ruby.gemset_for(app)

  if ruby && gemset
    Stable::Services::Ruby.ensure_rvm!
    system("bash -lc 'rvm #{ruby}@#{gemset} --create do true'")
    rvm_cmd = "rvm #{ruby}@#{gemset} do"
  elsif ruby
    rvm_cmd = "rvm #{ruby} do"
  else
    rvm_cmd = nil
  end

  log_file = File.join(path, 'log', 'stable.log')
  FileUtils.mkdir_p(File.dirname(log_file))

  cmd = if rvm_cmd
          "cd \"#{path}\" && #{rvm_cmd} bundle exec rails s -p #{port} -b 127.0.0.1"
        else
          "cd \"#{path}\" && bundle exec rails s -p #{port} -b 127.0.0.1"
        end

  pid = spawn('bash', '-lc', cmd, out: log_file, err: log_file)

  Process.detach(pid)

  AppRegistry.update(app[:name], started_at: Time.now.to_i, pid: pid)

  pid
end

.stop(app) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/stable/services/process_manager.rb', line 44

def self.stop(app)
  pid = app[:pid]
  return unless pid

  output = `lsof -i tcp:#{app[:port]} -t`.strip
  if output.empty?
    puts "No app running on port #{app[:port]}"
  else
    output.split("\n").each { |pid| Process.kill('TERM', pid.to_i) }
    puts "Stopped #{app[:name]} on port #{app[:port]}"
  end

  AppRegistry.update(app[:name], started_at: nil, pid: nil)
rescue Errno::ESRCH
  AppRegistry.update(app[:name], started_at: nil, pid: nil)
end