Class for spawning Rack applications.
Methods
Included Modules
Public Class methods
[ show source ]
# File lib/passenger/rack/application_spawner.rb, line 31 31: def self.spawn_application(*args) 32: @@instance ||= ApplicationSpawner.new 33: @@instance.spawn_application(*args) 34: end
Public Instance methods
spawn_application(app_root, lower_privilege = true, lowest_user = "nobody", environment = "production")
Spawn an instance of the given Rack application. When successful, an Application object will be returned, which represents the spawned application.
Raises:
- AppInitError: The Rack application raised an exception or called exit() during startup.
- SystemCallError, IOError, SocketError: Something went wrong.
[ show source ]
# File lib/passenger/rack/application_spawner.rb, line 44 44: def spawn_application(app_root, lower_privilege = true, lowest_user = "nobody", environment = "production") 45: a, b = UNIXSocket.pair 46: # Double fork in order to prevent zombie processes. 47: pid = safe_fork(self.class.to_s) do 48: safe_fork(self.class.to_s) do 49: a.close 50: run(MessageChannel.new(b), app_root, lower_privilege, lowest_user, environment) 51: end 52: end 53: b.close 54: Process.waitpid(pid) rescue nil 55: 56: channel = MessageChannel.new(a) 57: unmarshal_and_raise_errors(channel, "rack") 58: 59: # No exception was raised, so spawning succeeded. 60: pid, socket_name, using_abstract_namespace = channel.read 61: if pid.nil? 62: raise IOError, "Connection closed" 63: end 64: owner_pipe = channel.recv_io 65: return Application.new(@app_root, pid, socket_name, 66: using_abstract_namespace == "true", owner_pipe) 67: end