У меня был короткий таймфрейм на этом и мне не повезло с CPAN, поэтому я предоставлю свое решение здесь (я, вероятно, заново изобрел колесо). Я должен был сделать что-то прямо сейчас.
Я буду использовать ping в этом примере.
Когда пользователь запрашивает ping, сценарий AJAX создает запись в базе данных с подробной информацией о ping (хост, интервал, количество и т. Д.). Запись имеет автоматически увеличивающееся поле идентификатора. Затем он отправляет SIGHUP демону задания, который является просто демонизированным сценарием perl.
Этот демон заданий получает SIGHUP, ищет новые задания в базе данных и обрабатывает каждое из них. Когда он получает новое задание, он разветвляется, записывает PID и состояние «работает» в запись базы данных, открывает файлы stdout / stderr на основе уникального идентификатора задания и использует IPC::Run
для направления STDOUT / STDERR к этим файлам.
Демон заданий отслеживает разветвленные задания, убивая их, если они выполняются слишком долго и т. Д.
Чтобы завершить вывод, скрипт AJAX отправляет обратно идентификатор задания в браузер. Затем в таймере Javascript вызывается сценарий AJAX, который в основном проверяет состояние задания с помощью записи в базе данных и отслеживает файлы.
Когда эхо-запрос заканчивается, демон задания устанавливает статус записи на «выполнено». Сценарий AJAX проверяет это при регулярных проверках статуса.
Одна из причин, по которой я сделал это, заключается в том, что сценарий AJAX и демон задания взаимодействуют и проходят аутентификацию (DB).