【问题标题】:Calling perl script from Java servlet从 Java servlet 调用 perl 脚本
【发布时间】:2011-10-10 18:18:25
【问题描述】:

我正在尝试从 tomcat 7 上的 java servlet 调用 perl 脚本。我已经设置了 context.xml 和 web.xml,因此我可以通过转到 http://localhost:8080/test/cgi-bin/test.pl 来运行 .pl 文件,我可以也可以直接在 java 中运行 perl,如下所示:

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);
        }
    }

这很好用,但是如果我尝试通过替换以下内容来引用我的 /WEB-INF/cgi 文件夹中的 .pl 脚本:

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 

我猜这又回到了原来的问题?

【问题讨论】:

    标签: java perl servlets tomcat7


    【解决方案1】:

    有点令人困惑的是,当 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"};
    

    ?

    【讨论】:

    • 非常感谢@hobbs!您的权利 /WEB-INF/cgi/test.pl 以 #!/usr/bin/perl 开头,您的建议有效.. 但是我现在得到 p.waitFor() 抛出 2 的 InterruptedException,有什么想法吗?
    【解决方案2】:

    您的问题与运行 servlet 的上下文有关。您需要获取上下文,然后导航到您的文件。请参阅此处了解如何获取 servlet 上下文:How to get the Servlet Context from ServletRequest in Servlet 2.5?

    您将通过以下方式实现您的 servlet 上下文:

    ServletContext context = config.getServletContext();
    

    然后像这样使用该上下文:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多