Сценарий Perl cgi остается запущенным, когда клиент закрывает веб-страницу во время загрузки - PullRequest
2 голосов
/ 14 августа 2010

У меня есть Perl-скрипт (Cgi / Apache / Windows), который выполняет некоторые программы на компьютере и форматирует выходные данные для Интернета. Сценарий полностью запускается за 4-5 минут.

Моя проблема заключается в том, что когда кто-то отменяет загрузку страницы (или закрывает веб-браузер) во время выполнения сценария, процесс perl на сервере будет продолжать выполняться без каких-либо действий и блокирует все открытые файлы, чтобы другой сценарий не мог запустить. Процесс никогда не закончится, и мне нужно использовать «Завершить дерево процессов», чтобы завершить perl.exe и запущенные подпроцессы, чтобы можно было повторно запустить скрипт.

Как я могу убедиться, что скрипт не умрет, как это? (Если сценарий продолжает работать в фоновом режиме и завершить работу, это будет лучшим решением)

Ответы [ 3 ]

4 голосов
/ 14 августа 2010

Во-первых, сценарий CGI не должен запускаться в течение 4–5 минут.

Второе, см. Просмотр длительных процессов с CGI .

3 голосов
/ 15 августа 2010

Я бы сказал, что ваш шаблон дизайна неоптимальный.Сценарий CGI не должен выполнять какую-либо тяжелую обработку.Это должен быть доступ к БД, создание страницы и возвращение результата.Сценарий CGI должен выполняться за доли секунды.Apache не был разработан с учетом этого варианта использования.

Если вы хотите запустить длинное задание обработки, то это задание должно выполняться за пределами стека веб-приложений.Ваш CGI-скрипт может начать работу, проверить ее работу, убить ее и т. Д., Но не ждать ее.Пользовательское обновление или опрос ajax может проверить состояние запущенного задания.

1 голос
/ 15 августа 2010

Вы можете определить, нажал ли вы кнопку остановки, открыв STDOUT.Следующий код умрет в Apache / IIS CGI, если пользователь больше не ждет вашего ответа:

eval {
    print STDOUT "foobar" or die "Gone";
};
if ($@) {
    &cleanup;
}
&do_something;

Возможно, вы захотите напечатать что-нибудь более интеллектуальное ...

Обратите внимание,Скрипт за 4-5 минут резервирует дочерний процесс Apache полностью до самого завершения.Попробуйте запустить скрипт в фоновом режиме и опрашивать результаты с помощью AJAX.

...