Start background process/daemon from CGI script

后端 未结 10 1170
北恋
北恋 2020-12-10 02:02

I\'m trying to launch a background process from a CGI scripts. Basically, when a form is submitted the CGI script will indicate to the user that his or her request is being

10条回答
  •  情深已故
    2020-12-10 02:58

    Ok, I'm adding a simpler solution, if you don't need to start another script but continue in the same one to do the long process in background. This will let you give a waiting message instantly seen by the client and continue your server processing even if the client kill the browser session:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import os
    import sys
    import time
    import datetime
    
    print "Content-Type: text/html;charset=ISO-8859-1\n\n"
    print "Please wait...\n"
    sys.stdout.flush()
    os.close(sys.stdout.fileno()) # Break web pipe
    if os.fork(): # Get out parent process
       sys.exit()
    
    # Continue with new child process
    time.sleep(1)  # Be sure the parent process reach exit command.
    os.setsid() # Become process group leader
    
    # From here I cannot print to Webserver.
    # But I can write in other files or do any long process.
    f=open('long_process.log', 'a+')
    f.write( "Starting {0} ...\n".format(datetime.datetime.now()) )
    f.flush()
    time.sleep(15)
    f.write( "Still working {0} ...\n".format(datetime.datetime.now()) )
    f.flush()
    time.sleep(300)
    f.write( "Still alive - Apache didn't scalped me!\n" )
    f.flush()
    time.sleep(150)
    f.write( "Finishing {0} ...\n".format(datetime.datetime.now()) )
    f.flush()
    f.close()
    

    I have read half the Internet for one week without success on this one, finally I tried to test if there is a difference between sys.stdout.close() and os.close(sys.stdout.fileno()) and there is an huge one: The first didn't do anything while the second closed the pipe from the web server and completly disconnected from the client. The fork is only necessary because the webserver will kill its processes after a while and your long process probably needs more time to complete.

提交回复
热议问题