【问题标题】:Perl system function returns -1 even after successful executionPerl 系统函数即使在成功执行后也返回 -1
【发布时间】:2025-12-18 16:50:01
【问题描述】:

我在使用 3rd 方 perl 脚本时遇到了一些奇怪的情况。演示:

my $rc = system("tar -C /app/src -xvf /app/package.tar.gz");

if ($rc != 0)
{
   print "Return code: $rc";  
}

直接在 shell 上运行tar -C /app/src -xvf /app/package.tar.gz 工作正常,echo $? 显示退出状态0。都好。

另外,当运行这个小的 perl sn-p 时,返回总是 -1。如果我尝试类似:

my $rc = system("ls");

if ($rc != 0)
{
   print "Return code: $rc";  
} 

...返回码也是-1

我对 perl 了解不多,所以我想知道什么可能会触发这种行为。

文档没有特别提到与此有关的任何内容 (http://perldoc.perl.org/functions/system.html)。


解决方案:

获取$!以获取有关错误的更多详细信息:

my $rc = system("tar -C /app/src -xvf /app/package.tar.gz");

if ($rc != 0)
{
   print "Return code: $rc\n";
   print "Reason: $!";  
}

返回:

Return code: -1
Reason: No child processes

应用$SIG{'CHLD'} = 'DEFAULT'; 解决了这个问题:

$SIG{'CHLD'} = 'DEFAULT';

my $rc = system("tar -C /app/src -xvf /app/package.tar.gz");

if ($rc != 0)
{
   print "Return code: $rc\n";
   print "Reason: $!";  
}

一些细节来自: What's the difference between various $SIG{CHLD} values?

【问题讨论】:

  • 我可以想象第一种情况的问题,但第二种情况很奇怪。你在什么系统上?您的 Perl 程序是否正常运行 - 或者这是您尝试的第一个?如果您将输出重定向到一个文件(system('ls > ls.txt') 或类似的文件),之后您会得到正确的文件吗?如果你改用反引号,my $ret = qx(ls); 你会在$ret 中得到什么?
  • $SIG{CHLD} 的值是多少?为什么localized 的值没有变化?
  • @choroba “为什么没有本地化值更改?”是什么意思? $SIG{CHLD} 以前未定义,默认为IGNORE(据我了解文档)。
  • 啊,好的。剩下的问题是为什么 Perl 无法 wait() 获取 system
  • 很高兴您对其进行了深入研究并进行了更新,但请注意,这根本不能解释您在第二个 sn-p 中报告的奇怪行为。安装信号处理程序(默认情况下!)“修复”它的事实是很好的诊断,但那里有一些严重的问题。

标签: perl return system return-code


【解决方案1】:

就在您链接到的文档中(强调我的):

-1的返回值表示程序启动失败或wait(2)系统调用出错(原因检查$!)。

【讨论】:

  • 谢谢您,先生!我(完全不知道)$!... 这给了我一些额外的细节:No child processes
最近更新 更多