Thanks for the prompt reply response inline. I'm still having issues
even though I've changed some code based on your advice.

On Thu, Aug 18, 2011 at 9:51 PM, Glyph Lefkowitz
<[email protected]> wrote:
>
> On Aug 19, 2011, at 12:42 AM, Stephan wrote:
>
>> 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
>
> Defunct processes have exited, but not been reaped.  In older versions of 
> Twisted, this might happen if some other library were competing to register 
> the SIGCHLD signal.  What version of Twisted are you using?

I'm using the latest version (I installed it today). 11.0.0 on an ubuntu machine

>
>> 2) perhaps because it goes defunct but the timeout I set in place in the 
>> processprotocol does
>> not trigger.
>
> It should never go defunct, whether or not your timeout triggers.

I agree, I can't figure out why it's going defunct.

>
>> ==============
>> 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
>
> You should really not busy-loop like this waiting for the subprocess.  Have a 
> repeating callLater (or LoopingCall) that does this check cooperatively with 
> the reactor, so if something goes wrong (for example: firefox fails to 
> launch), you'll be able to react to it effectively rather than just hanging 
> your Twisted process forever.  If firefox isn't actually starting correctly, 
> or that file doesn't actually get created for some reason, this could cause 
> the defunct process.


I agree with your point, I've changed it a bit (see the code at the
bottom) I'm not sure if this is correct or not.

>
>> 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)
>>
>> _______________________________________________
>> Twisted-web mailing list
>> [email protected]
>> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web
>
>
> _______________________________________________
> Twisted-web mailing list
> [email protected]
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web
>

============
new code (still does not work)
=============
108         profile_id = self.profile['name']
109         command = ["/usr/bin/xvfb-run", "--auto-servernum",
"/usr/bin/firefox", "-P", profile_id]
110         subprocess = reactor.spawnProcess(TimedProcessProtocol(20),
111                                             command[0], command)
112         logging.debug(type(subprocess))
113         logging.debug("spawned a process: pid: %d", subprocess.pid)
114
115         lc = LoopingCall(self.check_if_file)
116         self.check = lc
117         lc.start(0.5)
118
119     def check_if_file(self):
120         if os.path.exists(self.fireshark_profile_dir + "/firesharkReady"):
121             logging.debug("firesharkReady file to exist")
122             self.check.stop()

============
new code (log)
=============

478C0-CA07-11E0-B595-E88E810DE385
2011-08-18 22:06:58,038 DEBUG:FirefoxProcess run called
2011-08-18 22:06:58,038 DEBUG:intialize firefox files
2011-08-18 22:06:58,040 DEBUG:connection made timeout = 20
2011-08-18 22:06:58,041 DEBUG:<class 'twisted.internet.process.Process'>
2011-08-18 22:06:58,041 DEBUG:spawned a process: pid: 30562
2011-08-18 22:07:01,374 DEBUG:inConnectionLost
2011-08-18 22:07:01,374 DEBUG:errConnectionLost
2011-08-18 22:07:01,375 DEBUG:process exited, status 1


=======================

this time the xvfb process did not go defunct but it did exit, which
shouldn't really happen, firefox should just stay open really.

_______________________________________________
Twisted-web mailing list
[email protected]
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web

Reply via email to