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

Bash SCP循环在一段时间后停止执行,bash,scp,Bash,Scp,所以我有两个相同脚本的版本。他们都试图将我的个人资料复制到我的infra上的所有服务器上(大约5k)。我遇到的问题是,无论我使用哪一个版本,我总是会在大约300台服务器的某个位置卡住进程。无论我是按顺序还是并行执行,两个版本都会失败,并且都是在随机服务器上。我没有收到任何错误消息(是的,我知道我现在正在将错误消息重定向到null),它只是在到达接近300台服务器的随机点后停止执行,它只是在那里徘徊,什么也不做 我能得到的最好的运行时间是357台服务器 可能是一些我不知道的细节导致了这一点。有人能

所以我有两个相同脚本的版本。他们都试图将我的个人资料复制到我的infra上的所有服务器上(大约5k)。我遇到的问题是,无论我使用哪一个版本,我总是会在大约300台服务器的某个位置卡住进程。无论我是按顺序还是并行执行,两个版本都会失败,并且都是在随机服务器上。我没有收到任何错误消息(是的,我知道我现在正在将错误消息重定向到null),它只是在到达接近300台服务器的随机点后停止执行,它只是在那里徘徊,什么也不做

我能得到的最好的运行时间是357台服务器

可能是一些我不知道的细节导致了这一点。有人能提供建议吗

顺序的
#/bin/bash
清楚的
回显“$(日期)-进程已启动”
all_count=“$(cat all_servers.txt | wc-l)”
读服务器时
做
scp-B-o“StrictHostKeyChecking no./.bash_profile rouser@${server}:/home/rosuer/&&echo“$server-Done!”>./log.log | | echo“$server-Failed!”>./log.log
完成。/log.log | | echo“$server-失败!”>>。/log.log&

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

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

顺序的
#/bin/bash
清楚的
回显“$(日期)-进程已启动”
all_count=“$(cat all_servers.txt | wc-l)”
读服务器时
做
scp-B-o“StrictHostKeyChecking no.”bash_profile-rouser@${server}:\
&&echo“$server-Done!”>>log.log\
||echo“$server-失败!”>>log.log
完成
平行的 对于并行解决方案,我将您的条件语句括在括号中,以防管道将错误的进程作为背景

#!/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!!"
#/bin/bash
清楚的
回显“$(日期)-进程已启动”
all_count=“$(cat all_servers.txt | wc-l)”
读服务器时
做
(
scp-B-o“StrictHostKeyChecking no.”bash_profile-rouser@${server}:\
&&echo“$server-Done!”>>log.log
||echo“$server-失败!”>>log.log
) &
完成
SSH密钥
我强烈建议您学习更多关于SSH的知识。
scp-B
标志对我来说是未知的,因为我习惯于使用SSH密钥和SSH代理,这将使这种连接无缝(如果在cron作业中运行,则使用无密码密钥)。

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

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

顺序的
#/bin/bash
清楚的
回显“$(日期)-进程已启动”
all_count=“$(cat all_servers.txt | wc-l)”
读服务器时
做
scp-B-o“StrictHostKeyChecking no.”bash_profile-rouser@${server}:\
&&echo“$server-Done!”>>log.log\
||echo“$server-失败!”>>log.log
完成
平行的 对于并行解决方案,我将您的条件语句括在括号中,以防管道将错误的进程作为背景

#!/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!!"
#/bin/bash
清楚的
回显“$(日期)-进程已启动”
all_count=“$(cat all_servers.txt | wc-l)”
读服务器时
做
(
scp-B-o“StrictHostKeyChecking no.”bash_profile-rouser@${server}:\
&&echo“$server-Done!”>>log.log
||echo“$server-失败!”>>log.log
) &
完成
SSH密钥
我强烈建议您学习更多关于SSH的知识。
scp-B
标志对我来说是未知的,因为我习惯于使用SSH密钥和SSH代理,这将使这种连接无缝(如果在cron作业中运行此功能,请使用无密码密钥)。

您的while循环应该能够通过使用单一输入重定向来读取文件列表,即
读取服务器时;做完成
。您的列表是每行1台服务器,服务器名称中没有空格,对吗?祝你好运。运行
ps
(例如,Linux上的
ps-C scp uww
)以了解它在被卡住时将连接到哪个服务器。然后手动对该服务器运行
scp
,看看它是否能成功。@Sheller是的,命名没有问题。@pynexj没有特定的服务器被卡住。它会随机卡住,而且总是在300台服务器左右。但是不总是在同一条线上,
scp
的某个实例可能正在从stdin读取数据,从而导致主机列表出错。在读取服务器时尝试
,您的while循环应该能够通过使用单个输入重定向来读取文件列表,即
在读取服务器时;做完成
。您的列表是每行1台服务器,服务器名称中没有空格,对吗?祝你好运。运行
ps
(例如,Linux上的
ps-C scp uww
)以了解它在被卡住时将连接到哪个服务器。然后手动运行

#!/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!!"
#!/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!!"