2013-04-24 78 views
0

我有一個perl CGI調用一個java應用程序,它依次檢查一個Mysql數據庫。如果我搜索不存在的條目,java應用程序會在服務器上顯示異常處理程序消息(需要X顯示窗口)。這個例外是直截了當並且可以理解的,但是必須點擊才能關閉它,此時perl CGI可以繼續。客戶當然不能(也不應該)看到異常消息。Perl調用java - 如何防止異常顯示?

我的問題是..我怎樣才能防止異常消息顯示在服務器窗口,並防止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

謝謝。 Rocky。

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

謝謝。 我加入這個...

$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

嘗試在您的perl cgi腳本中包含業務邏輯中的數據庫訪問 – 2013-04-24 14:40:10

+0

如果您使用'Open2'使用'waitpid'來等待它完成。你不必殺死這個過程。 – TrueY 2013-04-25 07:57:05

回答

1

修正和擴展

嘗試

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

它重定向到javastderr無門。或者重定向到一個文件(如2>/tmp/java_error.$$)以保存它調試錯誤。

如果是在windows上使用2>nul

或使用IPC::Open3並根據您的需要處理兩個輸入文件句柄。

更詳細。我創建了一個簡單a.java代碼寫入到標準輸出,標準錯誤,並拋出如果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 

因此,堆棧轉儲按預期寫入stderr,因此可以重定向。

$ 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安裝它。

+0

謝謝。看到我上面的補充。似乎我可能必須修改java代碼。 – Rocky 2013-04-24 18:21:35

+0

@搖滾:對不起,如果我的描述不夠清楚。您可以在命令行上重定向或使用'Open2'。使用兩者都是毫無意義的。但我會檢查發生了什麼,因爲程序甚至可以直接寫入終端。 – TrueY 2013-04-25 07:56:11

+0

好的,謝謝。我會解決這個問題並實施你的建議。我會讓你知道我最終會得到什麼。 – Rocky 2013-04-25 15:30:15