Apache CGI and spawning another process

F

Francis Hwang

Hey all,

There's probably a very easy answer to my question, but I've never been
very good with managing process and haven't been able to find this
addressed directly in the archives. So: I'm trying to have a CGI script
that will publish a ton of different XML files. The publishing process
is pretty long, maybe it will run 10 or 15 minutes, but it's not
complicated, and the user doesn't need any feedback, they just need a
message that says "we started the process; it should be done in a few
minutes."

I tried running code that looks like this:

is_parent = fork
system '/some/external/script.rb' unless is_parent
print "Location: /admin_page\n"

And this works on the command-line. It prints the location line right
away and then ends quickly, leaving the external script to run in the
background until it finishes of its own accord.

But the same script doesn't work in Apache ... it runs the external
script, but hangs and doesn't exit. I guess Apache is treating the
spawning of external processes differently. Anybody have experience
with this? Is there some really obvious solution I'm missing?

tia,
Francis Hwang
http://fhwang.net/
 
J

James Britt

Francis said:
Hey all,
..


But the same script doesn't work in Apache ... it runs the external
script, but hangs and doesn't exit. I guess Apache is treating the
spawning of external processes differently. Anybody have experience with
this? Is there some really obvious solution I'm missing?

Hack, off the top of my head, untested (but I may yet go try it)
Write a task to crontab and set the time a few seconds from now.

Or: Just have a cron job that pulls tasks off a file-based queue.

Plus the usual caveats about duplication, notification, hung tasks, and
so on.

James
 
J

Joost Diepenmaat

Hey all,

There's probably a very easy answer to my question, but I've never been
very good with managing process and haven't been able to find this
addressed directly in the archives. So: I'm trying to have a CGI script
that will publish a ton of different XML files. The publishing process
is pretty long, maybe it will run 10 or 15 minutes, but it's not
complicated, and the user doesn't need any feedback, they just need a
message that says "we started the process; it should be done in a few
minutes."

I tried running code that looks like this:

is_parent = fork
system '/some/external/script.rb' unless is_parent
print "Location: /admin_page\n"

And this works on the command-line. It prints the location line right
away and then ends quickly, leaving the external script to run in the
background until it finishes of its own accord.

But the same script doesn't work in Apache ... it runs the external
script, but hangs and doesn't exit. I guess Apache is treating the
spawning of external processes differently. Anybody have experience
with this? Is there some really obvious solution I'm missing?

You should probably close the $stdout (and possibly $stdin and $stderr)
streams in the child process, otherwise apache will think there is still
more output coming.

cheers,
Joost Diepenmaat.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top