我有一个调用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消息。 没有睡眠行,java消息不会弹出。换句话说,它看起来像pid被杀死了,但速度很快,结果不会被输入mytest.txt。我认为睡眠功能会为java应用程序提供一些时间,然后kill会删除弹出消息。但这不会发生。
似乎我不得不请求更改java应用程序,以便它不会在服务器的屏幕上显示消息。
答案 0 :(得分:1)
更正并延长
尝试
system("java -Dby.product=true -jar javaApp.jar $version status 2>/dev/null >mytest.txt");
它将stderr
的{{1}}重定向到无处。或者重定向到文件(如java
)以保存它以调试错误。
如果是在Windows上使用2>/tmp/java_error.$$
。
或者使用 IPC::Open3 并根据需要处理两个输入文件句柄。
更详细。我创建了一个简单的2>nul
代码,它写入stdout,stderr并在定义了arg时引发异常:
a.java
我编译并运行它(不关心gcj警告):
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; }
}
};
因此堆栈转储按预期写入stderr,因此可以重定向。
$ 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
IPC::Open3的示例程序:
$ perl -e 'system("gij -cp . a x 2>/dev/null")'
STDOUT
输出:
#!/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";
即便是IPC :: Open3的手册页也建议使用IPC::Run包。我试过,但它不是正态分布的一部分。因此,如果您愿意,可以从CPAN安装它。