Вызов сценария perl из сервлета Java - PullRequest
1 голос
/ 10 октября 2011

Я пытаюсь вызвать Perl-скрипт из сервлета Java на tomcat 7. Я настроил context.xml и web.xml, чтобы я мог запустить файл .pl, перейдя к http://localhost:8080/test/cgi-bin/test.plи я также могу запустить Perl непосредственно из Java, например:

String[] cmdArr = new String[]{"perl", "-e", "print \"Content-type: text/html\n\n\";$now = localtime();print \"<h1>It is $now</h1>\";"};
if (cmdArr != null) {
        Process p = null;
        Runtime rt = Runtime.getRuntime();
        try {
            p = rt.exec(cmdArr);  // throws IOException
            returnValue = p.waitFor();    // throws InterruptedException
        }
        catch (IOException xIo) {
            throw new RuntimeException("Error executing command.",xIo);
        }
        catch (InterruptedException xInterrupted) {
            throw new RuntimeException("Command execution interrupted.",xInterrupted);
        }

        InputStreamReader isr = new InputStreamReader(p.getInputStream());
        BufferedReader stdout = null;
        stdout = new BufferedReader(isr);
        String line = null;
        try {
            while ((line = stdout.readLine()) != null) {
                System.out.println(line);
            }
        }
        catch (IOException xIo) {
            throw new RuntimeException("Error reading process output", xIo);
        }
    }

, и это прекрасно работает, но если я попытаюсь обратиться к сценарию .pl, который находится в моей папке / WEB-INF / cgi,замена:

String[] cmdArr = new String[]{"perl", "-e", "print \"Content-type: text/html\n\n\";$now = localtime();print \"<h1>It is $now</h1>\";"};

на что-то вроде:

String cmdArr = "/WEB-INF/cgi/test.pl";

или

String cmdArr = "/cgi-bin/test.pl";

Я получаю эту ошибку:

java.io.IOException: Cannot run program "/WEB-INF/cgi/test.pl": error=2, No such file or directory

Я предполагаю, что я что-то не так с пути к файлу?Любая помощь будет очень признательна!


ОБНОВЛЕНИЕ: после комментария @hobbs я изменился на: String[] cmdArr = new String[]{"perl", "/WEB-INF/cgi/test.pl"};

, но если я добавлю следующее перед .waitFor ():

 BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
 String line;
 while ( (line = br.readLine()) != null){
       System.out.println(line);
 }

Я получаю отпечаток:

Can't open perl script "/WEB-INF/cgi/test.pl": No such file or directory 

Я полагаю, это вернулось к исходной проблеме?

Ответы [ 2 ]

2 голосов
/ 10 октября 2011

Несколько сбивает с толку, когда системный вызов exec возвращает «Нет такого файла или каталога» в сценарии, это обычно означает, что интерпретатор в строке shebang не может быть найден.например, если /WEB-INF/cgi-test.pl начинается с #!/usr/bin/perl, возможно, что / usr / bin / perl не существует.Или, если файл имеет окончания строки Windows, это может привести к тому, что ядро ​​будет искать интерпретатор с именем "/usr/bin/perl\x0a", который не может быть найден.

Так как вы установили, что можете запускать программы смассив команд, который начинается с "perl", как насчет:

String cmdArr = new String[]{"perl", "/WEB-INF/cgi/test.pl"};

?

0 голосов
/ 28 июня 2014

Ваша проблема связана с контекстом, в котором запускается ваш сервлет.Вам нужно получить контекст, а затем перейти к вашему файлу.Смотрите здесь, чтобы узнать, как получить контекст сервлета: Как получить контекст сервлета из ServletRequest в Servlet 2.5?

Вы достигнете своего контекста сервлета таким образом, как это:

ServletContext context = config.getServletContext();

Тогда просто используйте этот контекст следующим образом:

String cmdArr = new String[]{"perl", context.getRealPath("/") + "WEB-INF/cgi/test.pl"};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...