【发布时间】:2020-05-20 17:48:07
【问题描述】:
我有大量的 Linux 服务器需要维护。我经常需要在所有这些上运行一个脚本 (script.sh) 以获得健康状态,这个脚本通常需要大约 30-40 秒才能给出输出。为了方便维护任务,我正在编写一个 shell 脚本,它使用 SSH 循环所有远程主机,运行 script.sh,收集输出并将其写入本地主机的日志文件。为了这个问题,我将这个脚本命名为 MyScript.sh
脚本运行良好,但是它必须等待 SSH 输出继续到下一个主机。因为我的服务器太多,而且命令是按顺序运行的,所以需要几分钟才能完成。我想并行遍历所有服务器,而无需等待每个主机的响应。
有没有一种方法可以使用 MyScript.sh 在所有主机上同时远程运行 script.sh?也许在后台运行 ssh 命令并以某种方式收集输出?
script.sh 的输出是由管道分隔的单行。比如下面的
host1|49 days|10%|3.77%|27677/63997 MB|43% - /usr|38% - /usr|Optimal|No|40%|No
Myscript.sh 的输出是所有没有管道的主机的输出串联。
Date Hostname Uptime CPU I/O Free MEM File System INODES STATUS WWW YYY ZZZ XXX
===================================================================================================================================================================================================
01/31/20 host1 44 days 5% 10.33% 38083/64000 MB 57% - / 37% - /usr OPTIMAL No 40% No
01/31/20 host2 45 days 11% 1.79% 27915/63997 MB 43% - /usr 38% - /usr OPTIMAL UP 7% OK
01/31/20 host3 45 days 2% 1.89% 32145/63997 MB 43% - /usr 38% - /usr OPTIMAL UP NO OK
01/31/20 host4 45 days 11% 3.72% 52477/128637 MB 49% - /var 38% - /usr OPTIMAL UP 8% OK
01/31/20 host5 45 days 6% 3.21% 65264/128637 MB 46% - /var 38% - /usr OPTIMAL UP NO OK
01/31/20 host6 45 days 7% 5.79% 56369/63997 MB 43% - /usr 38% - /usr OPTIMAL UP NO No
01/31/20 host7 45 days 6% 1.66% 56391/63997 MB 43% - /var 38% - /usr OPTIMAL UP NO No
MyScript.sh 的核心如下:
(
for ip in $IP_LIST;
do
echo "Checking $ip"
ssh -q -t $user@$ip 'sudo /tmp/script.sh' > /tmp/$$
current_date=$(date +%D)
printf "%-10s " "$current_date" >> $logfile
while read line;
do
echo $line | awk -F '|' '{printf("%-10s %-10s %-7s %-8s %-18s %-25s %-25s %-15s %-15s %-25s %-10s\n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11); }' >> $logfile
done< /tmp/$$
done
)
总之,我想优化这个脚本以在多台服务器上同时运行上述代码。 谢谢!
【问题讨论】:
-
非常容易使用 GNU Parallel,请参阅 gnu.org/software/parallel/…
-
请注意,GNU Parallel 不是库,它是包含 Perl 脚本的单个文件,大多数 Linux 发行版和 macOS 都默认包含 Perl。