|
Daniel J. Popowich
dpopowich at comcast.net
Mon Feb 13 19:08:54 EST 2006
Daniel Nogradi writes:
> Thanks a lot for the code, I didn't even think about such an
> approach, this would be the best of course.
>
> > For example, if you have this script, /tmp/foo.py:
> >
> > ############################################################
> > # /tmp/foo.py
> >
> > import signal
> > import time
> >
> > # ignore the TERM signal, so if apache kills the child process
> > # that forked me I won't die.
> > signal.signal(signal.SIGTERM, signal.SIG_IGN)
> >
> > # Your Code Here!
> > # for this demo we'll sleep, so you have time to stop apache and
> > # see this is still running
> > time.sleep(30)
> >
> > # some output to prove we ran
> > print "hello, world"
> >
> > #
> > ############################################################
> >
> >
> > Then in your handler:
> >
> > os.system('python /tmp/foo.py >& /tmp/foo.log &')
> >
> >
> > Daniel Popowich
> > ---------------
> > http://home.comcast.net/~d.popowich/mpservlets/
>
>
> I'm not sure I understand this. AFAIK both os.spawn* and os.system
> start a brand new process, with the only difference being how
> command line arguments are handled. Or not?
For python on unix, the os.spawn* calls are implemented in python with
underlying calls to os.fork and os.exec*. You can see the python
source yourself; look in os.py in the standard library. So, there's
really no difference between the exec* and spawn* calls.
You *could* do what you want with calls to os.fork and os.exec*, but
unless you're a unix systems programmer you will be biting off more
than you can chew. That is, this simple command line:
$ python myscript.py > logfile 2> errfile &
which can be easily executed from within python with:
os.system('python myscript.py > logfile 2> errfile &')
would be MANY tens of lines of code if implemented with fork and exec*
calls; setting up the redirection is particularly tricky. Take a look
at the implementation of the spawn* calls in os.py, that will give you
an idea, plus realize there is NO redirection of std{in,out,err}
happening in the spawn* code. It's a non-trivial undertaking.
Unless you want the intellectual exercise (which is more than enough
reason in my book! :-)), or need minutia control of process
parameters within python, I'd go with the os.system method and trap
signal.SIGTERM in your script.
Cheers,
Daniel Popowich
---------------
http://home.comcast.net/~d.popowich/mpservlets/
|