Start hintergrund-Prozess/daemon CGI-Skript

Ich versuche, starten Sie einen Hintergrundprozess, der von einem CGI-Skripte. Im Grunde, wenn ein Formular vorgelegt wird, das CGI-Skript werden, um dem Benutzer anzuzeigen, dass seine oder Ihre Anforderung verarbeitet wird, während der hintergrund-Skript führt die eigentliche Verarbeitung (weil die Verarbeitung neigt dazu, eine lange Zeit dauern.) Das problem, das ich bin vor ist, dass Apache nicht senden Sie die Ausgabe des übergeordneten CGI-Skript an den browser, bis das Kind Skript beendet wird.

Mir wurde gesagt von einem Kollegen, dass das, was ich tun möchte, ist unmöglich, weil es keine Möglichkeit gibt, um zu verhindern, dass der Apache vom warten auf den gesamten Prozess-Baum von einem CGI-Skript, um zu sterben. Allerdings habe ich auch gesehen, zahlreiche Referenzen rund um das web zu einem "Doppel-Gabel" - trick soll den job machen. Der trick beschrieben wird kurz und bündig in dieser Stack Overflow-Antwort, aber ich habe gesehen, ähnliche Codes an anderen stellen.

Hier eine kurze Skript, das ich schrieb, um zu testen, die Doppel-Gabel-trick in Python:

import os
import sys

if os.fork():
    print 'Content-type: text/html\n\n Done'
    sys.exit(0)

if os.fork():
    os.setsid()
    sys.exit(0)

# Second child
os.chdir("/")
sys.stdout.close()
sys.stderr.close()
sys.stdin.close()

f = open('/tmp/lol.txt', 'w')

while 1:
     f.write('test\n')

Wenn ich von der shell aus, es tut genau das, was ich erwarten würde: das original-Skript und die ersten Nachkommen sterben, und der zweite Nachkomme läuft weiter bis er getötet manuell. Aber wenn ich auf Sie durch CGI, die Seite wird nicht geladen, bis ich töten, der zweite Nachkomme oder Apache tötet, weil es von der CGI-timeout. Ich habe auch versucht, anstelle des zweiten sys.exit(0) mit os._exit(0), aber es gibt keinen Unterschied.

Was mache ich falsch?

Schreibe einen Kommentar