SCP循环在一段时间后停止执行

时间:2017-12-13 13:39:19

标签: bash scp

所以我有相同脚本的这两个版本。两者都试图将我的个人资料复制到我的infra上的所有服务器(大约5k)。我遇到的问题是无论我使用哪个版本,我总是让这个过程卡在300个服务器附近。如果我按顺序或并行执行它们都无关紧要,两个版本都会在随机服务器上失败。我没有收到任何错误消息(是的,我知道我现在将错误消息重定向到null),它只是在到达接近300台服务器的随机点后停止执行,它只是在那里无所事事。

我能得到的最好的跑步是为大约357台服务器做的。

可能有一些我不知道的细节导致了这个问题。有人可以建议吗?

顺序

#!/bin/bash
clear
echo "$(date) - Process started"
all_count="$( cat all_servers.txt | wc -l )"
while read server
do
    scp -B -o "StrictHostKeyChecking no" ./.bash_profile rouser@${server}:/home/rosuer/ && echo "$server - Done!" >> ./log.log || echo "$server - Failed!" >> ./log.log 

done <<< "$( cat all_servers.txt )"


echo "$(date) - Process completed!!"

并行

#!/bin/bash
clear
echo "$(date) - Process started"
all_count="$( cat all_servers.txt | wc -l )"
while read server
do
    scp -B -o "StrictHostKeyChecking no" ./.bash_profile rouser@${server}:/home/rosuer/ && echo "$server - Done!" >> ./log.log || echo "$server - Failed!" >> ./log.log &

done <<< "$( cat all_servers.txt )"

wait

echo "$(date) - Process completed!!"

1 个答案:

答案 0 :(得分:1)

让我们从更好的输入解析开始。我没有通过while读取循环从posix命令替换中解析bash herestring,而是通过管道直接在服务器列表中运行while读取循环(假设该文件中每行有一个服务器。如果这样,我可以解决这个问题。不是这样)。如果all_servers.txt的内容对于命令行来说太长,则会遇到错误和/或提前终止。

我还删除了无关的./项,我假设每个服务器上的rouser主目录实际上是/home/rouser(如果给定相对路径或根本没有路径,则scp默认为主目录)。

顺序

#!/bin/bash
clear
echo "$(date) - Process started"
all_count="$( cat all_servers.txt | wc -l )"

while read server
do
    scp -B -o "StrictHostKeyChecking no" .bash_profile rouser@${server}: \
        && echo "$server - Done!" >> log.log \
        || echo "$server - Failed!" >> log.log 
done < all_servers.txt

echo "$(date) - Process completed!!"

并行

对于Parallel解决方案,我已将条件括在括号中,以防管道正在处理错误的进程。

#!/bin/bash
clear
echo "$(date) - Process started"
all_count="$( cat all_servers.txt | wc -l )"

while read server
do
    (
        scp -B -o "StrictHostKeyChecking no" .bash_profile rouser@${server}: \
          && echo "$server - Done!" >> log.log
          || echo "$server - Failed!" >> log.log
    ) &
done < all_servers.txt

wait

echo "$(date) - Process completed!!"

SSH密钥

我强烈建议您更多地了解SSH。我不知道scp -B标志,因为我习惯使用SSH密钥和ssh-agent,这将使这种连接无缝连接(如果你在cron作业中运行它,则使用无密码密钥)。

相关问题