LINUX.ORG.RU

Запуск perl-скрипта из сервлета

 , ,


0

1

Как запустить perl'овский скрипт из сервлета?
Делаю через:

Runtime.getRuntime().exec();
Указываю абсолютные пути к перлу и к скрипту - не запускается.
Хотя, например, `ls -l` выполняется.
В чем проблема? Не хватает прав? Не находит скрипт? Не находит перл?

★★★★★

Ответ на: комментарий от Valor

Понимаю, что костыль. Тогда вопрос такой: есть парсер на перле, есть сервлет. Как организовать запуск парсера через запросы к сервлету?

kovrik ★★★★★ ()
Ответ на: комментарий от kovrik

В зависимости от того какой контейнер сервлетов или сервер приложений используется. У Jetty например есть встроенная возможность запускать cgi скрипты из указанной директории хоть на баше. У остальных такой фичи на сколько я знаю, нет.

Вообще если верить гуглу то подобный костыль довольно таки востребован. Например на запрос execute perl script on java servlet, гугл разродился довольно таки исчерпывающей по данному вопросу инфой.

Если нужна помощь именно по твоей реализации, то не поленись опубликовать свой код и ошибку.

Valor ()
Ответ на: комментарий от Valor

И вообще так ли трудно переделать парсер на Java ? Получилось бы и безкостыльно да и вообще.

Подумаю над этим, но там придется использовать HtmlUnit, а я его жутко не люблю, т.к. медленный, тяжелый и жрет много памяти.

Если нужна помощь именно по твоей реализации, то не поленись опубликовать свой код и ошибку.


Код:

String command = "perl /tmp/parser.pl"; 
Runtime.getRuntime().exec(command);
ps -a | grep perl показывает, что perl запускается, но потом, почти сразу, убивается.

kovrik ★★★★★ ()
Ответ на: комментарий от kovrik

Подумаю над этим, но там придется использовать HtmlUnit, а я его жутко не люблю, т.к. медленный, тяжелый и жрет много памяти.

Нахрена ?

String command = «perl /tmp/parser.pl»;

Runtime.getRuntime().exec(command);

http://stackoverflow.com/questions/7716946/calling-perl-script-from-java-servlet

Если не секрет, что твой парсер парсит ?

Valor ()
Ответ на: комментарий от Valor

Парсит страницы facebook'а.
А HtmlUnit понадобится для получения access_token'а.

В общем, может, позже перепишу на Java, но пока что хотелось бы разобраться с проблемой :)
Перефразирую вопрос: есть некий скрипт на перле. В какую папку его надо положить и что надо прописать, чтобы запустить его из сервлета?

kovrik ★★★★★ ()
Ответ на: комментарий от kovrik

Попробуй выполнить так и обрати внимание на вывод скрипта..

[code] public static void main(String args[]) { try { Process p=Runtime.getRuntime().exec(«ls -l»); p.waitFor(); BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));

String line=reader.readLine(); while(line!=null) { System.out.println(line); line=reader.readLine(); }

} catch(IOException e1) {} catch(InterruptedException e2) {}

System.out.println(«Done»); } [/code]

Valor ()
Ответ на: комментарий от kovrik

Скорее всего ошибаюсь, но может этому скрипту не хватает каких-то переменных окружения? Если это возможно, то хотя-бы в качестве теста, попробуйте запускать этот скрипт от какого-либо пользователя (в сессии которого этот скрипт точно работает):

String command = "su - user -c 'perl /tmp/parser.pl'";
boneshaker ()
Ответ на: комментарий от boneshaker

Немного пересмотрел задачу - все равно, если будет более-менее большая нагрузка, то нужен будет планировщик. Поэтому решил сделать примерно так:
1. На сервлет приходит запрос - он добавляется в базу
2. Каждые N минут по крону запускается скрипт, который забирает новые запросы из базы и запускает для каждого парсер.

kovrik ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.