在后台同步ssh

时间:2012-02-19 19:59:58

标签: bash ssh

这是以下问题的后续行动: Executing ssh command in a bash shell script within a loop

我正在做类似的工作:

while read line
do
   ssh -n root@$line 'command'
   do something
done

问题是我只想在前一个ssh行中完成'command'的执行时才执行“do something”部分,即我想等到后台ssh完成。 我可以使用睡眠,但这不适合我的应用。请指导我。

我不想特别在后台运行ssh。我只是这样做,以便我的循环正常运行。如Executing ssh command in a bash shell script within a loop中所述 如果我们不给-n标志,循环在第一次执行ssh命令后终止。

2 个答案:

答案 0 :(得分:2)

如果您的命令未在后台运行,执行ssh server command将等待该命令完成。例如,试试这个:

ssh server "sleep 3"
echo finished

这将在sleep 3实际执行远程服务器后(即3秒后)打印“已完成”。

试试这个 - 在〜/ tmp中创建三个文件 - 称为行,parent.sh和child.sh。对于测试,请在运行sshd的某台计算机上进行测试,这样您就可以使用ssh localhost代替ssh server。把它放在其中:

  • line1
    line2
    line3
    
  • parent.sh

    while read l; do
      echo next line
      ssh -n localhost "~/tmp/child.sh $l"
    done < lines
    echo parent
    
  • child.sh

    echo child processing: $1
    sleep 2
    echo child done
    

当你运行父:

$ cd ~/tmp
$ ./parent.sh

输出将是:

next line
child processing: line1
child done
next line
child processing: line2
child done
next line
child processing: line3
child done
parent

表示在父级继续处理下一行之前执行子级。您将在“子处理”和“完成子项”行之间看到2秒的睡眠(在{。}}中执行{child}。)。

请注意sleep 2不是为了在后台运行ssh -n - 而是为了不使用stdin。要在后台运行ssh,可以使用ssh - 请参阅ssh -f

答案 1 :(得分:0)

一点谷歌搜索帮助我:

while read line
do
   ssh root@$line 'command' < /dev/null
   do something
done

这样就不需要-n标志了。 更多细节: http://72.14.189.113/howto/shell/while-ssh/