Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl调用java-如何防止异常显示?_Java_Perl_System_Call - Fatal编程技术网

Perl调用java-如何防止异常显示?

Perl调用java-如何防止异常显示?,java,perl,system,call,Java,Perl,System,Call,我有一个perl CGI,它调用java应用程序,java应用程序反过来检查Mysql数据库。如果搜索不存在的条目,java应用程序会在服务器上显示异常处理程序消息(需要一个X显示窗口)。异常是直截了当的,可以理解,但是必须单击以关闭它,此时perl CGI可以继续。客户当然不能(也不应该)看到异常消息 我的问题是。。如何防止异常消息显示在服务器窗口上并阻止CGI继续?有没有办法关闭来自perl的消息?我可以控制perl脚本,但不能控制我调用的java应用程序 $ENV{'DISPLAY'}='

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

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

$ENV{'DISPLAY'}='myserver:0.0'
$testline=system(“java-Dby.product=true-jarjavaapp.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应用程序进行更改,以便它不会在服务器的屏幕上显示消息

更正和扩展

试一试

它将
java
stderr
重定向到别处。或者重定向到一个文件(如
2>/tmp/java\u error.$$
)以保存该文件并调试错误

如果在windows上,请使用
2>nul

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

更详细。我创建了一个简单的
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警告):

因此,堆栈转储会按预期写入stderr,因此可以重定向

$ perl -e 'system("gij -cp . a x 2>/dev/null")' 
STDOUT
示例程序包括:


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

如果您使用
Open2
used
waitpid
等待它完成,请尝试在perl cgi脚本(从java程序翻译)中包含对业务逻辑的数据库访问。您不必终止该过程。谢谢。见我的补充上面。看来我必须修改java代码了。@Rocky:如果我的描述不够清楚,很抱歉。您可以在命令行上进行重定向,也可以使用
Open2
。两者都使用是毫无意义的。但是我会检查正在发生什么,因为程序甚至可以直接写入终端。好的,谢谢。我会把这件事搞砸,然后落实你的建议。我会让你知道我的结局。@Rocky:Open2是一个错误的猜测,但Open3似乎没问题。但是如果您真的不需要stdout和stderr,我建议您将它们重定向到
/dev/null
并使用
系统
函数。@Rocky:OOPS!我想我误解了你的要求!:(我原以为您会为异常生成的堆栈跟踪而烦恼!但实际上有一个消息框,指出找不到所需的版本(或类似版本)。您的kill解决方案可以满足这一要求。
$ 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
#!/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)