【问题标题】:Perl system() does not wait in nano serverPerl system() 不在 nano 服务器中等待
【发布时间】: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


【解决方案1】:

我收到了 ActiveState 支持部门对此问题的回复。

Nano 服务器不支持标准 ActiveState 构建。 Nano 缺少的组件太多。如果您有兴趣进行定制构建,我可以将您与我们的销售团队联系,他们可以描述我们的企业级产品。

因此,如果我想坚持使用 Nano 服务器,我要么必须等到有人决定将它实施到标准构建中,要么我需要切换到不同的 Perl 发行版。

在那之前,我将使用有效的服务器核心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 2015-05-12
    • 2013-08-26
    • 1970-01-01
    • 2013-10-25
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多