On 04:32 pm, schenette@gmail.com wrote:
I think I might have figured out that you have to add usePTY=1 to associate the process group, so that the children will be killed when the parent process is killed. e.g. subprocess = reactor.spawnProcess(self.pp, args[0], args, env = os.e nviron, usePTY=1)
This is a not bad approach. Another possibility might be to leave usePTY out but change how you kill the process. There is the notion of "process groups", which contain one or more processes, and all of the processes in a group can be sent a signal by passing a negative number to os.kill. For your case, the process group would probably be the same as the pid of the xvfb-run process, so you could do something like: os.kill(-process.transport.pid, SIGTERM) Whether this is better or worse than using a PTY depends on the particulars of how xvfb-run manages its child process, whether it is okay to actually have a pty allocated, and probably some other POSIX arcana.
but I tried to separate out the killing in another process and now the new method isnt' called. are ProcessProtocol classes allowed to have other methods added to it for calling?
45 def killProcessIfAlive(self): 46 logging.debug("killProcessIfAlive called") 47 try: 48 yield self.transport.signalProcess('KILL') 49 except error.ProcessExitedAlready: 50 logging.debug("process already exited") 51 pass
It looks like you wanted killProcessIfAlive to be decorated with inlineCallbacks, but I don't see that here. So that would prevent the signal from ever actually being sent. signalProcess doesn't return a Deferred though, so you can skip inlineCallbacks and the yield and that should also fix the problem.
52 53 def connectionMade(self): 54 logging.debug("connection made timeout = %d", self.timeout) 55 @defer.inlineCallbacks 56 def onTimer(): 57 logging.debug("timeout triggered") 58 self.killProcessIfAlive() 59 d = reactor.callLater(self.timeout, onTimer)
Ah, there's the inlineCallbacks. It won't work there, though, it needs to go onto the generator function (the function that has yield in it). Jean-Paul