Хвост "Работа" с Perl под mod_perl - PullRequest
1 голос
/ 26 мая 2010

Этот проект, запущенный под mod_perl, показывает некоторую информацию о хосте. На этой странице есть текстовое поле с раскрывающимся списком, который позволяет пользователям пинговать / nslookup / traceroute хост. Вывод отображается в текстовом поле как tail -f.

Отлично работает под CGI. Когда пользователь запрашивает пинг, он делает AJAX-вызов на сервер, где он по существу начинает пинг с вывода, идущего во временный файл. Затем последующие вызовы ajax будут «хвостить» файл так, чтобы вывод обновлялся до завершения проверки связи. После завершения работы временный файл будет удален.

Однако, в mod_perl, что бы я ни делал, я могу остановить его от создания процессов зомби. Я перепробовал все, двойное разветвление, использование IPC::Run и т. Д. В конце концов, системные вызовы не поддерживаются в mod_perl.

Итак, мой вопрос, может быть, есть лучший способ сделать это? Доступен ли модуль CPAN для создания заданий командной строки и вывода результатов, которые будут работать в mod_perl? Я просто ищу несколько предложений.

Я знаю, что, возможно, смогу создать своего рода демона 'задания', о котором я сообщу детали и получу обновления. Он будет запускать команды и отслеживать их состояние и т. Д. Но есть ли более простой способ?

Заранее спасибо.

1 Ответ

0 голосов
/ 27 мая 2010

У меня был короткий таймфрейм на этом и мне не повезло с CPAN, поэтому я предоставлю свое решение здесь (я, вероятно, заново изобрел колесо). Я должен был сделать что-то прямо сейчас.

Я буду использовать ping в этом примере.

Когда пользователь запрашивает ping, сценарий AJAX создает запись в базе данных с подробной информацией о ping (хост, интервал, количество и т. Д.). Запись имеет автоматически увеличивающееся поле идентификатора. Затем он отправляет SIGHUP демону задания, который является просто демонизированным сценарием perl.

Этот демон заданий получает SIGHUP, ищет новые задания в базе данных и обрабатывает каждое из них. Когда он получает новое задание, он разветвляется, записывает PID и состояние «работает» в запись базы данных, открывает файлы stdout / stderr на основе уникального идентификатора задания и использует IPC::Run для направления STDOUT / STDERR к этим файлам.

Демон заданий отслеживает разветвленные задания, убивая их, если они выполняются слишком долго и т. Д.

Чтобы завершить вывод, скрипт AJAX отправляет обратно идентификатор задания в браузер. Затем в таймере Javascript вызывается сценарий AJAX, который в основном проверяет состояние задания с помощью записи в базе данных и отслеживает файлы.

Когда эхо-запрос заканчивается, демон задания устанавливает статус записи на «выполнено». Сценарий AJAX проверяет это при регулярных проверках статуса.

Одна из причин, по которой я сделал это, заключается в том, что сценарий AJAX и демон задания взаимодействуют и проходят аутентификацию (DB).

...