为什么Perl后台进程需要在Windows 2012上按ENTER键?

为什么Perl后台进程需要在Windows 2012上按ENTER键?,windows,perl,amazon-web-services,Windows,Perl,Amazon Web Services,在我的Amazon Web Services(AWS)Windows 2012系统上,在后台运行的用于侦听网络请求的Perl脚本需要在返回backticks之前在服务器脚本(后台进程)cmd窗口中键入ENTER键。这不会发生在我的非AWS Windows 2008 R2系统上(该程序在没有交互的情况下正常运行)。它也可以在我的AWS Linux系统上正常工作(无需交互) 我的问题是,这是Windows 2012的问题还是AWS的问题,因为我没有任何2k12服务器可以测试,而这些服务器不在AWS中

在我的Amazon Web Services(AWS)Windows 2012系统上,在后台运行的用于侦听网络请求的Perl脚本需要在返回backticks之前在服务器脚本(后台进程)cmd窗口中键入ENTER键。这不会发生在我的非AWS Windows 2008 R2系统上(该程序在没有交互的情况下正常运行)。它也可以在我的AWS Linux系统上正常工作(无需交互)

我的问题是,这是Windows 2012的问题还是AWS的问题,因为我没有任何2k12服务器可以测试,而这些服务器不在AWS中。如果任何使用2k12系统的人都能测试一下,看看它是否能正常工作,我将不胜感激

重编:

- copy below code to client.pl and server.pl respectively
- start the server in the background: 
    perl server.pl bg

- run the client (different cmd window):
    perl client.pl
在我的本地服务器上,服务器正确地返回到客户机,没有任何交互。在我的AWS系统上,它挂起。在服务器cmd窗口中点击ENTER键会导致返回倒勾并发送响应。在前台模式下运行服务器脚本
perl server.pl run
,整个shebang在2012年正常工作,没有交互

注意:此测试代码中没有停止
server.pl
后台进程的方法。它必须通过任务管理器终止。此外,测试脚本不需要非核心模块(至少对于草莓Perl)

client.pl:

use warnings;
use strict;

use IO::Socket::INET;
use Storable;

my $mod = 'IO::Socket::INET';

my $sock = new IO::Socket::INET (
    PeerHost => 'localhost',
    PeerPort => 7800,
    Proto => 'tcp',
);
die "can't create socket\n" unless $sock;

$sock->send("cpanm $mod");

my $recv = Storable::fd_retrieve($sock);

print $$recv;
server.pl

use warnings;
use strict;

use IO::Socket::INET;
use Storable;

if (@ARGV && $ARGV[0] eq 'bg'){
    system 1, 'perl', $0, 'run';
}
if (@ARGV && $ARGV[0] eq 'run') {
    my $sock = new IO::Socket::INET (
        LocalHost => '0.0.0.0',
        LocalPort => 7800,
        Proto => 'tcp',
        Listen => 5,
        Reuse => 1,
    );
    die "cannot create socket $!\n" unless $sock;

    while (1){
        my $conn = $sock->accept;

        my $cmd;
        $conn->recv($cmd, 1024);

        print "executing: $cmd\n";
        my $ret = `$cmd`;
        print "return: $ret\n";
        Storable::nstore_fd(\$ret, $conn);

        shutdown($conn, 1);
    }

    $sock->close;
}

@池上:我的意思是“不需要任何非核心模块”。我很快会在这里试试你的建议。目前AFK@ikegami:您的
perl
字符串的两个变体与
cpanm
call@ikegami:服务器脚本cmd窗口要求在
cpanm
命令返回任何内容之前,先按ENTER键。处理它的perl进程将启动,但在keystroke@ikegami:是的,在服务器窗口中击键之前,服务器不会响应客户端,因为我打开了两个cmd窗口…@ikegami:我的意思是“不需要任何非核心模块”。我很快会在这里试试你的建议。目前AFK@ikegami:您的
perl
字符串的两个变体与
cpanm
call@ikegami:服务器脚本cmd窗口要求在
cpanm
命令返回任何内容之前,先按ENTER键。处理它的perl进程将启动,但在keystroke@ikegami:是的,服务器在服务器窗口中击键之前不会响应客户端,因为我打开了两个cmd窗口。。。