如何在perl中的foreach循环中查找最后执行的命令状态

sam*_*ath 1 unix bash perl sh

我有一个逻辑,它将根据服务器列表一个接一个地执行启动服务,现在的问题是最后一个服务器成功执行后,我需要根据状态执行一些操作。如何处理命令以等到最后一个服务器执行

请建议

示例代码。

    foreach my $Server_name(@servers)
    {
     my $command =qq(sudo /bin/su - jenkins -c "ssh scm\@$Server_name ' /bin/sh ${SCRIPT_HOME}/startService.sh'");
    print "$command\n";
    system($command);
            if ($?== 0)
            {
             do some action

             }
}
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 5

在这种情况下,$?变量包含状态system,但系统本身也会返回该状态。然后将其返回值分配给变量并在循环后检查它

my $exit_status;
foreach my $server_name (@servers)
{
     my $command = qq(sudo /bin/su - jenkins -c "ssh scm\@$server_name ' /bin/sh ${SCRIPT_HOME}/startService.sh'");
     print "$command\n";
     $exit_status = system($command);
}

if ($exit_status == 0) { ... }
Run Code Online (Sandbox Code Playgroud)

我也想发表评论

  • 我们不知道您从错误中需要什么,但考虑是否$?足够;如果你只检查错误,它的罚款,否则你从得到system的是最后一个wait通话的状态。各种IPC模块可提供更好的错误报告

  • 字符串中的for命令system可能是不安全的,因为它可能先传递给shell进行解释。如果实际上不需要外壳,最好使用不涉及外壳的LIST形式的system;另请参阅exec以了解LIST表单

  • 要为命令准备一个字符串,最好使用String :: ShellQuote