我試圖從多個服務器異步運行多個SSH命令,我想從命令中捕獲輸出並按順序顯示它們。 爲了拋出一個額外的曲線球,我希望pid3只在pid2完成時運行,並且在前三個命令完成後運行pid4。這個最好的方法將如何實現?如何異步運行多個perl打開命令並按順序顯示輸出
實施例:
// $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'\"");
請參閱tsee的答案http://stackoverflow.com/questions/1752357/how-can-i-run-a-system-command-in-perl-asynchronously?rq=1。此外,在你的問題中唯一的異步東西是pid1 vs pid2/3。其他一切都是順序的。 – imran 2013-04-05 04:31:09
儘管目前所有4個命令都是異步運行的,但您所期望的效果是正確的。 – 2013-04-05 04:33:49
在創建$ pid3之前,請確保處理並關閉$ SSH2。然後,在創建$ pid4之前,確保處理並關閉$ SSH1和$ SSH3。但是有比使用open()更好的方法,請參閱上面鏈接中的建議。 – imran 2013-04-05 04:39:49