0

我有一个调用 java 应用程序的 perl CGI,该应用程序又检查 Mysql 数据库。如果我搜索不存在的条目,java 应用程序会在服务器上显示异常处理程序消息(需要 X 显示窗口)。该异常是直截了当且可以理解的,但是必须单击以将其关闭,此时 perl CGI 可以继续。客户当然不能(也不应该)看到异常消息。

我的问题是..如何防止异常消息显示在服务器窗口上并阻止 CGI 继续?有没有办法关闭来自 perl 的消息?我可以控制 perl 脚本,但不能控制我调用的 java 应用程序。

$ENV{'DISPLAY'} = 'myserver:0.0';
$testline = system("java -Dby.product=true -jar javaApp.jar $version status>mytest.txt") >> 8;

如果 $version 不存在,我会得到异常。我将结果通过管道传输到文件中,以便以后在 perl 中进行文件处理

谢谢。洛基。

======================

谢谢。我加了这个...

$ENV{'DISPLAY'} = 'server:0.0';
use IPC::Open2;
use POSIX ":sys_wait_h";
$pid = open2(\*CHLD_OUT, \*CHLD_IN, "java -Dby.product=true -jar javaApp.jar $version status>mytest.txt 2>/tmp/java_error.$$"); 
sleep(5);
kill('TERM', $pid);

如果我在数据库中使用一个已知值,它可以像以前一样正常工作。如果我搜索一个不存在的值,java 消息仍然会弹出。如果没有 sleep 行,则不会弹出 java 消息。换句话说,它看起来像 pid 被杀死了,但是太快了以至于结果没有被输入 mytest.txt。我认为 sleep 功能会给 java 应用程序一些时间来工作,然后 kill 会删除弹出消息。但这不会发生。

看来我可能不得不请求对 java 应用程序进行更改,以便它不会在服务器的屏幕上显示消息。

4

1 回答 1

1

更正和扩展

尝试

system("java -Dby.product=true -jar javaApp.jar $version status 2>/dev/null >mytest.txt");

stderr它将of重定向java到无处。或重定向到一个文件(如2>/tmp/java_error.$$)以保存它以调试错误。

如果是在 windows 上使用2>nul.

或者使用IPC::Open3并根据需要处理两个输入文件句柄。

更详细。我创建了一个简单的a.java代码,它写入 stdout、stderr 并在定义 arg 时抛出异常:

public class a {
  public static void main(String[] args) {
    System.out.println("STDOUT");
    System.err.println("STDERR");
    if (args.length > 0) { int i = 1/0; }
  }
};

我编译并运行它(不关心 gcj 警告):

$ gcj -C a.java
$ gij -cp . a
STDOUT
STDERR
$ gij -cp . a x
STDOUT
STDERR
Exception in thread "main" java.lang.ArithmeticException: / by zero
   at a.main(a.java:5)
$ gij -cp . a >/dev/null
STDERR
$ gij -cp . a x 2>/dev/null
STDOUT

所以堆栈转储按预期写入标准错误,因此可以重定向。

$ perl -e 'system("gij -cp . a x 2>/dev/null")' 
STDOUT

带有IPC::Open3的示例程序:

#!/usr/bin/perl
use strict;
use warnings;
use IPC::Open3 'open3';
use Symbol 'gensym';

my ($fcin, $fcout, $fcerr);
$fcerr = gensym;
my $pid = open3 $fcin, $fcout, $fcerr, "gij -cp . a x";
my @out = <$fcout>;
my @err = <$fcerr>;
my $err = waitpid $pid, 0;
print "Exit:", ($err >> 8), "\n";
print "OUT: @out\n";
print "ERR: @err\n";

输出:

Exit:72
OUT: STDOUT

ERR: STDERR
 Exception in thread "main" java.lang.ArithmeticException: / by zero
    at a.main(a.java:5)

甚至 IPC::Open3 的手册页也建议使用IPC::Run包。我试过了,但它不是正态分布的一部分。因此,如果您愿意,可以从 CPAN 安装它。

于 2013-04-24T15:31:45.963 回答