On 12/03/2015, at 1:28 PM, Jason Garber <[email protected]> wrote:

> Hi Graham,
> 
> I've been starting to work with background processes as a replacement for 
> clunky cron-jobs in a major application.  Here is what I mean:
> 
> WSGIDaemonProcess Async-ShockBox-60011 processes=1 threads=1 
> python-path=/home/jason/DevLevel.2/AMSTMT/Python 
> display-name=Async-ShockBox-60011
> 
> WSGIImportScript /home/jason/DevLevel.2/AMSTMT/Async/ShockBox.py 
> process-group=Async-ShockBox-60011 application-group=%{GLOBAL}
> 
> This works great:
> 1. the script runs as expected
> 2. if I kill it as root with kill -9 then it is restarted automatically
> 
> I have some questions...
> 
> 1. Is there any way to select what error log the output goes to.  Currently 
> it is going to the global apache error log.

Only thing I can think of is to create a fake VirtualHost and set ErrorLog for 
it and have the WSGIDaemonProcess directive in it.

<VirtualHost 127.0.0.255:*>
ErrorLog /some/path/error.log
WSGIDaemonProcess Async-ShockBox-60011 processes=1 threads=1 
python-path=/home/jason/DevLevel.2/AMSTMT/Python 
display-name=Async-ShockBox-60011
WSGIImportScript /home/jason/DevLevel.2/AMSTMT/Async/ShockBox.py 
process-group=Async-ShockBox-60011 application-group=%{GLOBAL}
</VirtualHost>

I have thought about an option to WSGIDaemonProcess to override the error log 
before, but isn't so simple.

BTW, thanks for asking this question. Will have to allow an error log to be 
specified with this trick for service scripts in mod_wsgi-express.

> 2. Is there any way, short of `kill -9` or restarting apache, to restart the 
> daemon process that is being used by WSGIImportScript?

The TERM and HUP signals should work as well and will attempt to properly 
shutdown the process.

Very recent versions of mod_wsgi should be a lot smarter about handling signals 
received if from this service process you fork a new process to do actual work 
which you wait on. There was a bug before where if sent a signal to one of the 
forked processes that it would actually shutdown the parent mod_wsgi daemon 
process because of the loopback UNIX pipe used to tell process to shutdown due 
to a signal.

For a forked process, you can register your own signal handlers, but again for 
that to work properly, need a very recent mod_wsgi version.

> 3. Is there any way, within a daemon process itself, to restart itself?  I 
> tried sys.exit() but got this:
> 
> mod_wsgi (pid=25983): SystemExit exception raised by WSGI script 
> '/home/jason/DevLevel.2/AMSTMT/Async/ShockBox.py' ignored.

Send a SIGINT or SIGTERM to itself should work.

Worst case, us os._exit(). That will do an immediate exit of process and not 
try and shutdown Python interpreter, run atexit callbacks etc.

Am curious to hear more about what you are doing and whether this was inspired 
by the recent long discussion about WebFaction where I showed how to use a 
daemon process to run a multiprocessing module queue manager to accept requests 
from WSGI application to do jobs in forked sub processes with timeouts on 
processes.

There are all sorts of tricks for using daemon processes don't think anyone 
would realise. Want to make my PyCon AU talk this year about it.

For example, did you know that you could fork/exec a redis or memcached inside 
of a daemon process and have Apache manage it?

Did you know you could run in a daemon process a mod_wsgi-express against a 
different Python version (ie., Python 3 rather than 2) and then setup proxies 
from Apache to it for a site name of sub URLs and so have Apache manage 
everything, with both Python 2 and Python 3 parts.

:-)

Graham

-- 
You received this message because you are subscribed to the Google Groups 
"modwsgi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/modwsgi.
For more options, visit https://groups.google.com/d/optout.

Reply via email to