所以我有相同脚本的这两个版本。两者都试图将我的个人资料复制到我的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!!"
答案 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。我不知道scp -B
标志,因为我习惯使用SSH密钥和ssh-agent,这将使这种连接无缝连接(如果你在cron作业中运行它,则使用无密码密钥)。