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