2011-03-08 7 views
1

私はゲームサーバーを制御し、その出力をリアルタイムで表示しようとしています。この私がこれまで持っているものです。PerlパイプがJavaプロセス出力をリダイレクトしない

#!/usr/bin/perl -w 
use IO::Socket; 
use Net::hostent;    # for OO version of gethostbyaddr 

$PORT = 9000;     # pick something not in use 

$server = IO::Socket::INET->new(Proto  => 'tcp', 
            LocalPort => $PORT, 
            Listen => SOMAXCONN, 
            Reuse  => 1); 

die "can't setup server" unless $server; 
print "[Server $0 accepting clients]\n"; 

while ($client = $server->accept()) { 
    $client->autoflush(1); 
    print $client "Welcome to $0; type help for command list.\n"; 
    $hostinfo = gethostbyaddr($client->peeraddr); 
    printf "[Connect from %s]\n", $hostinfo->name || $client->peerhost; 
    print $client "Command? "; 

    while (<$client>) { 
    next unless /\S/;  # blank line 
    if (/quit|exit/i) { 
     last;          } 
    elsif (/fail|omg/i) { 
     printf $client "%s\n", scalar localtime; } 
    elsif (/start/i) { 
     if (my $ping_pid = open(JAVA, "screen java -jar craftbukkit-0.0.1-SNAPSHOT.jar |")) { 
    while (my $ping_output = <JAVA>) { 
     # Do something with the output, let's say print 
     print $client $ping_output; 

     # Kill the C program based on some arbitrary condition (in this case 
     # the output of the program itself). 
       } 
     } 
     printf $client "I think it started...\n Say status for output\n";    } 
    elsif (/stop/i) { 
     print RSPS "stop"; 

    close(RSPS); 
     print $client "Should be closed.\n"; } 
    elsif (/status/i) { 
     $output = RSPS; 
     print $client $output;  } 
    else { 
     print $client "FAIL\n"; 
    } 
    } continue { 
     print $client "Command? "; 
    } 
    close $client; 
} 

それが唯一の欠点は、それがソケットにJavaプロセスの出力を出力していないということである(これは、その端末ウィンドウに出力を表示して、プロセスがうまく起動しますPerlは私がpingでこれを試しましたが、それはうまくいきました。

ありがとうございます!

+0

RSPSとは何ですか?初期化されていないようです。 – Rasika

+2

画面でJavaコードを開始するのはなぜですか? – Mat

+0

それは古いコードの少しだった、申し訳ありません... – Justin

答えて

0

screenリダイレクトを「スクリーン」への出力。コマンドでscreenを取り除く。

+0

同じ問題があるかどうかを試してみて... – Justin

+0

次に問題が複数あります。また、STDERR(上記のように)を処理する必要があります。または、アプリケーションがSTDOUTの代わりに端末に直接書き込むかもしれません。それが事実なら、あなたができることはあまりありませんが、私はよく分かりません。 – ikegami

1

Javaコード(または多分0x)のように聞こえて、出力が標準エラーストリームに出力されています。それは

抑制:あなたはcapture it separatelyにしたくないと仮定すると、いくつかの簡単な修正がある

open(JAVA, "screen java -jar craftbukkit-0.0.1-SNAPSHOT.jar 2>/dev/null |")

を標準出力ストリームにそれをキャプチャ:

open(JAVA, "screen java -jar craftbukkit-0.0.1-SNAPSHOT.jar 2>&1 |")

+0

私はこれを試します、それが動作する場合あなたに教えてくれます:) – Justin

+0

それは仕事をdidnt:/、私はソケット、任意のアイデアに出力をリダイレクトしようとしていますか? – Justin

関連する問題