|
Daniel Nogradi
nogradi at gmail.com
Mon Feb 13 21:35:26 EST 2006
> > > 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 &')
> >
> > 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.
I see, you are absolutely right, thanks a lot for the clarification.
|