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

时间:2017-11-29 07:57:50

标签: bash perl unix 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

             }
}

1 个答案:

答案 0 :(得分:4)

在这种情况下,$? variable包含system的状态,但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) { ... }

我也想发表评论

  • 我们不知道错误需要什么,但要考虑$?是否足够;如果你只检查 错误,那么它很好但是你从system得到的只是wait呼叫的最后状态。各种IPC模块提供了更好的错误报告

  • system字符串中的命令可能不安全,因为它可能会传递给shell进行解释。如果实际上不需要shell,最好使用system的LIST形式,其中没有shell;另请参阅exec以了解LIST表格

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