我有一个逻辑,它将根据服务器列表一个接一个地执行启动服务,现在的问题是最后一个服务器成功执行后,我需要根据状态执行一些操作。如何处理命令以等到最后一个服务器执行
请建议
示例代码。
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)
在这种情况下,$?变量包含状态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