Class: Sanford::Process

Inherits:
Object
  • Object
show all
Defined in:
lib/sanford/process.rb

Constant Summary collapse

HALT =
'H'.freeze
STOP =
'S'.freeze
RESTART =
'R'.freeze
WAIT_FOR_SIGNALS_TIMEOUT =
15

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(server, options = nil) ⇒ Process

Returns a new instance of Process.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/sanford/process.rb', line 17

def initialize(server, options = nil)
  options ||= {}
  @server = server
  @name   = "sanford: #{@server.process_label}"
  @logger = @server.logger

  @pid_file    = PIDFile.new(@server.pid_file)
  @signal_io   = IOPipe.new
  @restart_cmd = RestartCmd.new

  @server_ip   = @server.configured_ip
  @server_port = @server.configured_port
  @server_fd   = if !ENV['SANFORD_SERVER_FD'].to_s.empty?
    ENV['SANFORD_SERVER_FD'].to_i
  end
  @listen_args = @server_fd ? [@server_fd] : [@server_ip, @server_port]

  @client_fds = ENV['SANFORD_CLIENT_FDS'].to_s.split(',').map(&:to_i)

  skip_daemonize = ignore_if_blank(ENV['SANFORD_SKIP_DAEMONIZE'])
  @daemonize = !!options[:daemonize] && !skip_daemonize
end

Instance Attribute Details

#client_fdsObject (readonly)

Returns the value of attribute client_fds.



15
16
17
# File 'lib/sanford/process.rb', line 15

def client_fds
  @client_fds
end

#nameObject (readonly)

Returns the value of attribute name.



14
15
16
# File 'lib/sanford/process.rb', line 14

def name
  @name
end

#pid_fileObject (readonly)

Returns the value of attribute pid_file.



14
15
16
# File 'lib/sanford/process.rb', line 14

def pid_file
  @pid_file
end

#restart_cmdObject (readonly)

Returns the value of attribute restart_cmd.



14
15
16
# File 'lib/sanford/process.rb', line 14

def restart_cmd
  @restart_cmd
end

#serverObject (readonly)

Returns the value of attribute server.



14
15
16
# File 'lib/sanford/process.rb', line 14

def server
  @server
end

#server_fdObject (readonly)

Returns the value of attribute server_fd.



15
16
17
# File 'lib/sanford/process.rb', line 15

def server_fd
  @server_fd
end

#server_ipObject (readonly)

Returns the value of attribute server_ip.



15
16
17
# File 'lib/sanford/process.rb', line 15

def server_ip
  @server_ip
end

#server_portObject (readonly)

Returns the value of attribute server_port.



15
16
17
# File 'lib/sanford/process.rb', line 15

def server_port
  @server_port
end

#signal_ioObject (readonly)

Returns the value of attribute signal_io.



14
15
16
# File 'lib/sanford/process.rb', line 14

def signal_io
  @signal_io
end

Instance Method Details

#daemonize?Boolean

Returns:

  • (Boolean)


66
# File 'lib/sanford/process.rb', line 66

def daemonize?; @daemonize; end

#runObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/sanford/process.rb', line 40

def run
  ::Process.daemon(true) if self.daemonize?
  log "Starting Sanford server for #{@server.name}..."

  @server.listen(*@listen_args)
  log "Listening on #{@server.ip}:#{@server.port}"

  $0 = @name
  @pid_file.write
  log "PID: #{@pid_file.pid}"

  @signal_io.setup
  trap_signals(@signal_io)

  start_server(@server, @client_fds)

  signal = catch(:signal) do
    wait_for_signals(@signal_io, @server)
  end
  @signal_io.teardown

  run_restart_cmd(@restart_cmd, @server) if signal == RESTART
ensure
  @pid_file.remove
end