Perl Pipe 不重定向 Java 进程输出

发布于 2024-10-21 12:21:49 字数 2014 浏览 3 评论 0原文

我正在尝试控制游戏服务器并实时显示其输出。这就是我到目前为止所拥有的:

#!/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 尝试过了,效果很好,有什么想法吗?

提前致谢!

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?

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

谜兔 2024-10-28 12:21:49

听起来 Java 代码(或者可能是屏幕)正在将一些输出打印到标准错误流。假设您不想单独捕获它,一些简单的修复方法是:

抑制它:


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 |")

It sounds like the Java code (or maybe it's screen) is printing some output to the standard error stream. 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 |")

最冷一天 2024-10-28 12:21:49

screen 将输出重定向到“屏幕”。去掉命令中的screen

screen redirects the output to the "screen". Get rid of the screen in the command.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文