为什么Perl后台进程需要在Windows 2012上按ENTER键?
在我的Amazon Web Services(AWS)Windows 2012系统上,在后台运行的用于侦听网络请求的Perl脚本需要在返回backticks之前在服务器脚本(后台进程)cmd窗口中键入ENTER键。这不会发生在我的非AWS Windows 2008 R2系统上(该程序在没有交互的情况下正常运行)。它也可以在我的AWS Linux系统上正常工作(无需交互) 我的问题是,这是Windows 2012的问题还是AWS的问题,因为我没有任何2k12服务器可以测试,而这些服务器不在AWS中。如果任何使用2k12系统的人都能测试一下,看看它是否能正常工作,我将不胜感激 重编:为什么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中
- 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窗口。。。