首页 > 解决方案 > Perl system() 不在 nano 服务器中等待

问题描述

我正在尝试在基于 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 特有的。

标签: perldockernano-server

解决方案


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

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

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

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


推荐阅读