Bash 后台同步ssh

Bash 后台同步ssh,bash,ssh,Bash,Ssh,这是对以下问题的后续行动: 我也在做类似的工作: while read line do ssh -n root@$line 'command' do something done 问题是,我只想在前一个ssh行中“command”的执行完成时执行“do something”部分,即我想等待后台ssh完成。 我可以使用睡眠,但这不适合我的应用。请引导我 我不想特别在后台运行ssh。我这样做只是为了让我的循环正常运行。如 如果我们没有给出-n标志,循环将在第一次执行ssh命令后终止。

这是对以下问题的后续行动:

我也在做类似的工作:

while read line
do
   ssh -n root@$line 'command'
   do something
done
问题是,我只想在前一个ssh行中“command”的执行完成时执行“do something”部分,即我想等待后台ssh完成。 我可以使用睡眠,但这不适合我的应用。请引导我

我不想特别在后台运行ssh。我这样做只是为了让我的循环正常运行。如
如果我们没有给出-n标志,循环将在第一次执行ssh命令后终止。

如果您的命令没有在后台运行,则执行
ssh server命令将等待该命令完成。例如,尝试以下方法:

ssh server "sleep 3"
echo finished
这将在远程服务器上实际执行
sleep 3
后打印“finished”(完成)(即3秒后)

试试这个-在~/tmp中创建三个名为line的文件,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
    
运行“父级”时:

$ 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
这表明子进程将在父进程继续处理下一行之前执行。您将在“child processing”和“child done”行之间看到2秒钟的睡眠(在child.sh中执行
sleep 2
的结果)


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

一点谷歌帮助:

while read line
do
   ssh root@$line 'command' < /dev/null
   do something
done
读取行时
做
ssh root@$line“命令”
这样,就不需要-n标志。 有关详细信息:

我已经编辑了这个问题,并添加了为什么要在后台执行ssh。我想找到一种方法,使循环在后台不运行ssh的情况下运行,或者找到某种方法来检测此ssh进程的完成情况。请查看我的编辑-请尝试我放在那里的内容,看看是否如您所期望的那样工作。您是对的--n有助于使用stdin。我使用了/dev/null从中读取输入,代码在没有-n的情况下运行良好。问题解决了。一点谷歌搜索帮助我:当读取line do ssh root@$line“command”-n
标志应该没有问题-它仍然在前台运行,与
-f
标志不同。
while read line
do
   ssh root@$line 'command' < /dev/null
   do something
done