Убедитесь, что команда at установлена ​​и пользователь, запускающий приложение, не находится в /etc/at.deny

аюсь запустить фоновый процесс из сценариев CGI. В основном, когда форма отправляется, сценарий CGI будет указывать пользователю, что его запрос обрабатывается, в то время как фоновый сценарий выполняет фактическую обработку (поскольку обработка обычно занимает много времени.) Проблема, с которой я сталкиваюсь является то, что Apache не будет отправлять вывод родительского сценария CGI в браузер, пока дочерний сценарий не завершится.

Коллега сказал мне, что то, что я хочу сделать, невозможно, потому что нет способа помешать Apache ждать, пока все дерево процессов сценария CGI не умрет. Тем не менее, я также видел многочисленные ссылки в Интернете на трюк с «двойной вилкой», который должен делать эту работу. Уловка кратко описана вэтот ответ переполнения стека, но я видел похожий код в другом месте.

Вот короткий скрипт, который я написал, чтобы проверить трюк с двумя форками в 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')

Если я запускаю это из оболочки, он делает именно то, что ожидал: оригинальный скрипт и первый потомок умирают, а второй потомок продолжает работать, пока не будет уничтожен вручную. Но если я получу доступ к нему через CGI, страница не загрузится, пока я не убью второго потомка или Apache не убьет его из-за тайм-аута CGI. Я также попытался заменить второйsys.exit(0) с участиемos._exit(0)Но разницы нет.

Что я делаю неправильно?

Ответы на вопрос(10)

Ваш ответ на вопрос