Class for spawning Rack applications.

Methods
Included Modules
Public Class methods
spawn_application(*args)
    # 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.
    # 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