【问题标题】:Perl system() call failed with return code 65280Perl system() 调用失败,返回码 65280
【发布时间】:2012-08-12 22:08:27
【问题描述】:

我运行下面的 perl 代码。

$retCode = ClearCase($cmd); 

没有错误,但是当我运行它时它返回65280

$retCode = ClearCase($logcmd); 

我在 XP 和 Windows 2003 服务器上尝试过,结果相同,均使用 ActiveState Perl v5.14.2。

此代码在 2 年前在其他地方运行。

  $g_HPPC_DEV_DRIVE =  "M";
  $g_HPPC_DEV_VIEW = "bldforge_AOMS_DEV";
  $g_logfile = "logfile.txt";
  
  $cmd = "startview $g_HPPC_DEV_VIEW";
  $logcmd = $cmd . " >> $g_logfile 2>>&1";
  
  $targetDir = $g_HPPC_DEV_DRIVE . ":\\" . $g_HPPC_DEV_VIEW;
  print "\$targetDir = $targetDir\n"; 
  print "Starting view .......\n"; 
  #$retCode = system("cleartool startview bldforge_AOMS_DEV >> logfile.txt");
  #$retCode = `cleartool startview bldforge_AOMS_DEV`;

  $retCode = ClearCase($logcmd);
  #$retCode = ClearCase($cmd);

sub ClearCase
{
  my $retCode = 0;
  my $args = $_[0];

  my $cmd = "cleartool " . $args;
  $retCode = Execute($cmd);

  return $retCode;

}

sub Execute
{
  my $retCode = 0;
  my $cmd = $_[0];

  if ($g_HPPC_BUILD_SIMULATION ne "Y")
  {
     
     print("Execute() Running...:   $cmd\n");     
     $retCode = system($cmd);
     #$retOut = `$cmd`;     
     #$retCode = $?;
     #print("Command execute output: $retOut\n");
  }
  else
  {
     print("Execute() *** SIMULATION:   $cmd\n");     
  }

  print("Execute() retCode = $retCode, $cmd\n");
  
  return $retCode;
}

这个65280退出码是什么意思?

【问题讨论】:

  • 你应该use autodie 或检查$! 看看你是否得到了更具描述性的信息。不过,“clearcase”可能由于某种原因被破坏了,您需要从它而不是您的 Perl 代码开始调查。
  • 那必须是 use autodie qw(:all) 才能使 system 死亡。
  • 重定向操作符2>>&1 看起来很奇怪,试试单楔2>&1
  • 与 2>&1 相同。这段代码都在另一个环境中工作。不知道为什么它在这里不起作用。
  • 退出代码 65280 是无效的 unix 退出代码号。正确的范围是 7 位:0-255。我从 bash 5.0.18 shell 收到 65280 退出代码,在 Linux 上调用 python 3.8.5 以运行 exit_code = os.system("ssh user@host_ip 'some_command.sh'" 使得 some_command 需要超过 5 分钟,然后我强制停止 sshd 服务器端,拔下计算机,拔下无线路由器或TCP 的其他一些迅速消亡。 Python 客户端没有收到来自操作系统的数据,python 将一个 64 位整数塞进 7 位:65280。这个数字可疑地接近最大 16 位值 65,536。

标签: windows perl clearcase cleartool


【解决方案1】:

请记住,如perldoc -f system 中所述,system 的返回值“...是等待调用返回的程序的退出状态。要获得实际的退出值,请右移八……”。将 65280 移动 8 得到 255。

但不幸的是,这也不是很有帮助,因为据我所知,每个可能的 cleartool 退出代码的确切含​​义都没有记录。我能找到的最接近的是cleartool documentation 中的此链接,其中指出,“单命令模式的退出状态取决于命令是成功(零退出状态)还是生成错误消息(非零退出状态) )。"

所以你有它; a 255 是一个非零退出状态,表示错误情况。从好的方面来说,它可能会生成一条您没有看到的错误消息。

作为一种故障排除技术,由于您已经在打印$cmd,因此请从命令行调用cleartool,使用您的程序生成的相同命令。如果您得到相同的结果,则问题将变为cleartool 问题而不是 Perl 问题。幸运的是,错误条件会生成一条您可以实际看到的错误消息,而不仅仅是退出代码。

另一方面,如果你得到正确的行为,请开始查看 Perl 运行时环境和命令行环境之间的不同之处;权限、环境变量、路径、工作目录等

【讨论】:

  • 问题还是一样:我可以运行 $retCode = ClearCase($cmd);没有错误,但运行时返回 65280: $retCode = ClearCase($logcmd);这个“>> $g_logfile 2>>&1”导致了这个问题。我也可以毫无问题地从 Windows 命令行运行。我无法使用 system() 或 `` 调用收到任何错误消息。不知道哪里出错了。
  • @Alex 65280 是您的解释器编程语言,将默认的 16 位或 64 位数字填充到 7 位 unix 数字中,此损坏的内存由您的终端作为 65280 反刍给您。这是一个失败的致命错误恢复尝试从产生该数字的任何程序。
【解决方案2】:

在使用cleartool时,最好确保使用ccperl(now called ratlperl),即ClearCase打包的perl,而不是latest Active Perl(which actually is the 5.14.2)。

因此,不要默认启动您的 perl 脚本,而是选择您的 %PATH% 中可用的第一个 perl.exe,尝试使用其中一个 perl included with ClearCase 调用它:

  • ratlperl:在C:\Program Files\Rational\Common
  • 或旧版ccperl:在C:\Program Files\Rational\ClearCase\bin中。

并查看错误是否仍然存在。

根本原因是PATH 问题:有几个perl 可用:

  • 来自 Rational ClearCase 的那些
  • Active Perl 中的一个

通过确保PATH 只引用一个perl(ClearCase 附带的那个),脚本可以成功启动。

【讨论】:

  • 我在使用 ccperl 或 ratlperl 时收到此错误。里面有注册码,怎么更新版本? Win32::Registry 对象版本 0.07 与 C:/Program File s/IBM/RationalSDLC/common/lib/perl5/5.8.6/MSWin32-x86-multi-thread/DynaLoader 中的 $Win32::Registry::VERSION 0.10 不匹配.pm 第 253 行。在 Z://../common.pl 第 12 行的 require 中编译失败。BEGIN failed--compilation 在 Z://../common.pl 第 12 行中止。编译在构建时的 require 中失败。 pl 第 28 行。
  • @user1288329 www-01.ibm.com/support/docview.wss?uid=swg21289331: "这个问题可能是因为在同一个系统上安装了多个版本的 Perl 并且设置了搜索路径环境变量,从而选择了“不正确的”Perl 版本第一的”。确保您的 PATH 不包含任何其他 perl
  • @user1288329 使用干净的 PATH 重试(请参阅之前的评论),并且没有您的“修复”。
  • 删除多个 Perl 路径解决了这个问题。非常感谢!
  • 我有更多问题,这次 chdir() 不起作用。我在同一家公司的 ClearCase 触发器中到处使用此代码。请参阅下面的源代码和输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
相关资源
最近更新 更多