I posted a patch to this very same problem in March of last year -- see the thread here: [1]http://lists.supervisord.org/pipermail/supervisor-users/2009-M arch/thread.html entitled "Child output is not logged when the child is stopped through supervisorctl". I've been running with a local branch of supervisord for a year with that patch. Perhaps we can finally get something like it integrated? regards, -- David
On Mon, 15 Mar 2010 00:33 -0400, "Mark Kalmes" <[email protected]> wrote: I had some trouble receiving a complete log from a process that receives a TERM signal, finishes processing, completes its output, and finally exits. When running under supervisord, I would not get the final elements in the output log. Anything that came after the TERM signal was truncated. I'm including the sample python file at the end of this post. If I change the process in order to log its output instead of writing to stdout, I receive the expected 'Exited gracefully.' message. Examining supervisor/process.py, I believe I found the lines causing my problem: Subprocess.drain() calls dispatcher.handle_read_event() unconditionally. In POutputDispatcher.handle_read_event(), we see that if there is no data to be read, the pipe is closed. (There is a note about there not being a more accurate way to see if the child process is done with it.) Subprocess calls drain() from both stop(), and finish(). If I comment out line 344, where drain() is called from Subprocess.stop(), my program behaves as expected. I can start and stop the process, and receive 'Exited gracefully.' as desired. drain() is still called from finish() when the process is reaped. Unfortunately, I don't know the full implications of the change. Is there a more appropriate change to make? What would be a good final solution so that output can be captured after a subprocess is passed a TERM signal? Thanks! Mark Kalmes sample subprocess for illustration: (supervisord.conf set with stopsignal=INT) #!/usr/bin/python # prove accepting SIGINT signal gives me the behavior I want.. from signal import * import logging, sys, time stopnow = False def interrupt(signal, stack): print "Interrupt raised" global stopnow stopnow = True def uninterruptiblefunc(): for i in range(10): print i time.sleep(1) signal(SIGINT, interrupt) while not stopnow: uninterruptiblefunc() print "Exited gracefully." _______________________________________________ Supervisor-users mailing list [email protected] http://lists.supervisord.org/mailman/listinfo/supervisor-users References 1. http://lists.supervisord.org/pipermail/supervisor-users/2009-March/thread.html
_______________________________________________ Supervisor-users mailing list [email protected] http://lists.supervisord.org/mailman/listinfo/supervisor-users
