简体   繁体   English

Perl Pipe不重定向Java进程输出

[英]Perl Pipe not redirecting Java process output

I'm trying to control a game server and display it's output in real time. 我试图控制游戏服务器并实时显示其输出。 This is what I have so far: 这是我到目前为止的内容:

#!/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;
 }

It starts the process just fine, the only flaw is that it's not outputting the output of the Java process to the socket (It is displaying the output in the terminal window that Perl was initiated with) I've tried this with ping and it worked just fine, any ideas? 它可以很好地启动进程,唯一的缺陷是它没有将Java进程的输出输出到套接字(它是在Perl初始化时在终端窗口中显示输出的),我用ping尝试了一下,并且工作了很好,有什么想法吗?

Thanks in advance! 提前致谢!

It sounds like the Java code (or maybe it's screen ) is printing some output to the standard error stream. 听起来Java代码(或者也许是screen )正在将一些输出打印到标准错误流中。 Assuming that you don't want to capture it separately , some easy fixes are: 假设您不想单独捕获它 ,则一些简单的修复方法是:

Suppress it: 抑制它:

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

Capture it in the standard output stream: 在标准输出流中捕获它:

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

screen redirects the output to the "screen". screen将输出重定向到“屏幕”。 Get rid of the screen in the command. 摆脱命令中的screen

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM