【发布时间】:2019-01-14 16:18:42
【问题描述】:
我正在尝试在基于 Windows 2016 Nano Server 的 docker 容器中运行 Perl 脚本。为此,我使用的是 ActivePerl 5.24。
现在我遇到了一个有趣的问题,即 system() 调用在我的 2016 Server 主机和 2016 Nano Server 容器中的行为不同。
#!/usr/bin/perl
use strict;
use warnings;
my $status = system('perl.exe -c test.plx');
print "Return: " . $status . "\n";
print "Exit: " . ($status >> 8) . "\n";
print "Signal: " . ($status & 127) . "\n";
print "Message: $!\n";
在主机 Windows 2016 Server 上,它按预期工作:
c:\>perl test.plx
test.plx syntax OK
Return: 0
Exit: 0
Signal: 0
Message:
在我的 Docker 容器中的 Nano 服务器上,它看起来像这样:
C:\>perl test.plx
Return: 768
Exit: 3
Signal: 0
Message:
所以你可以看到输出丢失并且返回码不是0。
如果我现在按回车键..
C:\>
C:\>test.plx syntax OK
所以看起来 system() 没有等待并返回 768(无论这意味着什么)
我也尝试使用“ping -v”而不是“perl -c”,但同样的事情发生了,所以它一定是与 system() 实现相关的东西。
有谁知道为什么同一个调用在 docker 容器中的行为完全不同,以及我可以做些什么来让 system() 等待?
更新: 当我使用 microsoft/windowsservercore 作为基础映像时,我确认它可以工作。所以这里发生的一切似乎都是 Nano Server 特有的。
【问题讨论】:
-
你的代码有点不对,应该是
print "Return: " . ($status & 0x7f) . "\n";,因为0x3 << 8 == 768 -
您可能希望查阅 POSIX 模块 metacpan.org/pod/distribution/perl/ext/POSIX/lib/POSIX.pod#WAIT 的文档,以使用标准宏解释来自
system()(派生自waitpid())的返回值,例如POSIX::WEXITSTATUS() -
Re "returns 768 (whatever that means)",我的意思是它没有被信号杀死,并且孩子退出时出现错误
3。记住,孩子是perl -V:sh给的shell,不是perl。 -
更可能的解释是
system确实在等待,但是它创建的 shell 在 shell 命令完成执行之前就退出了。 -
感谢
perl -V:sh的提示。这在这两种情况下都会返回sh='cmd /x /c';。但现在我可以尝试一下,看看cmd的行为是否有所不同。
标签: perl docker nano-server