I'm attempting to spawn xvfb with firefox using twisted's spawnProcess. I'm having two issues: 1) when I call a normal process (not xvfb) it seems to work, but when I call xvfb the process goes defunct 2) perhaps because it goes defunct but the timeout I set in place in the processprotocol does not trigger. ============== here is the code for spawning a process ============== 108 command = ["/usr/bin/xvfb-run", "--auto-servernum", "/usr/bin/firefox", "-P", profile_id] 109 subprocess = reactor.spawnProcess(TimedProcessProtocol(20), 110 command[0], command) 111 logging.debug(type(subprocess)) 112 logging.debug("spawned a process: pid: %d", subprocess.pid) 113 114 # this file will be created when firefox starts 115 while (not os.path.exists(self.profile_dir + "/importantfile")): 116 logging.debug("in while loop waiting for firesharkReady file to exist") 117 pass 118 119 logging.debug("file exist") ============== here is the process class ============== 27 class TimedProcessProtocol(protocol.ProcessProtocol): 28 29 def __init__(self, timeout): 30 self.timeout = timeout 31 32 def connectionMade(self): 33 logging.debug("connection made timeout = %d", self.timeout) 34 @defer.inlineCallbacks 35 def killIfAlive(): 36 logging.debug("timeout reached - killing process") 37 try: 38 yield self.transport.signalProcess('KILL') 39 except error.ProcessExitedAlready: 40 logging.debug("process already exited") 41 pass 42 43 d = reactor.callLater(self.timeout, killIfAlive) 44 45 def outReceived(self, data): 46 logging.debug("output: %s", data) 47 48 def errReceived(self, data): 49 logging.debug("errReceived %s", data)