【发布时间】:2013-04-08 05:51:48
【问题描述】:
我正在尝试对多个服务器异步运行多个 SSH 命令,我想捕获命令的输出并按顺序显示它们。 要添加一个额外的曲线球,我希望 pid3 仅在 pid2 完成后运行,而 pid4 在前三个命令完成后运行。这将如何最好地完成?
例子:
// $pid1 and $pid2 should run asynchronously
my $pid1 = open(my $SSH1, "|ssh -t -t runuser\@$server{'app'} 'sudo chef-client'");
my $pid2 = open(my $SSH2, "|ssh -t -t runuser\@$server{'auth'} 'sudo chef-client'");
// This command should wait for $pid2 to complete.
my $pid3 = open(my $SSH3, "|ssh -t -t runuser\@$server{'auth'} \"sudo -- sh -c '$update_commands'\"");
// This command should wait for $pid1-3 to complete before running.
my $pid4 = open(my $SSH4, "|ssh -t -t runuser\@$server{'varn'} \"sudo -- sh -c '$varn_commands'\"");
【问题讨论】:
-
查看stackoverflow.com/questions/1752357/… tsee 的答案。此外,您问题中唯一的异步内容是 pid1 vs pid2/3。其他一切都是顺序的。
-
您的预期效果是正确的,尽管目前所有 4 个命令都是异步运行的。
-
在创建 $pid3 之前,请确保您处理并关闭了 $SSH2。然后在创建 $pid4 之前,确保处理并关闭 $SSH1 和 $SSH3。但是有比使用 open() 更好的方法,请参阅上面链接中的建议。
标签: perl asynchronous