I am initiating long running processes from a browser and showing results after it completes. I have defined in my controller :
def runthejob
pid = Process.fork
if pid.nil? then
#Child
output = execute_one_hour_job()
update_output_in_database(output)
# Exit here as this child process shouldn't continue anymore
exit
else
#Parent
Process.detach(pid)
#send response - job started...
end
-
The request in parent completes correctly. But , in child, there is always a “500 internal server error” . rails reports “Completed 500 Internal Server Error in 227192ms” . I am guessing this happens because the request response cycle of the child process is not completed as there is a “exit” in child. How do I fix this?
-
Is this the correct way to execute long running processes ? Is there any better way to do it?
-
When child is running, if I do “
ps -e | grep rails” , I see that there are two instances of “rails server” . (I use the command “rails server” to start my rails server.)ps -e | grep rails
75678 ttys002 /Users/xx/ruby-1.9.3-p194/bin/ruby script/rails server
75696 ttys002 /Users/xx/ruby-1.9.3-p194/bin/ruby script/rails server
Does this mean that there are two servers running ? How are the requests handled now? Wont the request go to the second server?
Thanks for helping me.
Try your code in production and see if the same error comes up. If not, your error may be from the development environment being cleared when the first request completes, whilst your forks still need the environment to exist. I haven’t verified this with forks, but that is what happens with threads.
This line in your config/development.rb will retain the environment, but any code changes will require server restarts.