0

Mysql データベースをチェックする Java アプリケーションを呼び出す perl CGI があります。存在しないエントリを検索すると、Java アプリケーションはサーバーに例外ハンドラ メッセージを表示します (X ディスプレイ ウィンドウが必要です)。例外は簡単で理解できますが、クリックして閉じる必要があり、その時点で perl 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 アプリケーションの変更を要求する必要があるようです。

4

1 に答える 1

1

修正および拡張

試す

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

stderrjavaどこにもリダイレクトしません。または、ファイルにリダイレクトして ( など2>/tmp/java_error.$$)、エラーのデバッグを保存します。

Windows 上にある場合は、 を使用します2>nul

または、IPC::Open3を使用して、両方の入力ファイル ハンドルを好きなように処理します。

より詳細な。a.javastdout、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

したがって、スタック ダンプは期待どおり 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 の man ページでさえ、IPC::Runパッケージを使用することを提案しています。試してみましたが、正規分布の一部ではありません。そのため、必要に応じて CPAN からインストールできます。

于 2013-04-24T15:31:45.963 に答える