【问题标题】:how to find the last executed command status in foreach loop in perl如何在perl的foreach循环中查找最后执行的命令状态
【发布时间】:2018-05-12 20:40:27
【问题描述】:

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

请推荐

示例代码。

    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

             }
}

【问题讨论】:

  • 你的意思是“做一些动作”需要等待吗?以便在foreach 循环之后完成操作...?
  • 是的,“做一些动作”需要等待并根据 foreach 循环中最后执行的命令的状态执行。 @zdim
  • 那么就在foreach之后进行。对于每次迭代,将状态保存在一个变量中(在循环之前声明以便它存在于它之后),因此在循环之后,变量将具有最后一个命令的状态。这就是你的想法吗?

标签: bash perl unix sh


【解决方案1】:

本例中的$? 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) { ... }

我也想发表评论

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多