面试题答案
一键面试1. 编写主脚本实现并行执行子脚本并收集输出
- 使用
parallel-ssh
工具:parallel-ssh
是一个用于在多台服务器上并行执行命令的工具。首先确保在本地机器上安装了该工具(例如在Ubuntu上可以使用sudo apt install parallel-ssh
安装)。 - 编写主脚本示例:
#!/bin/bash
# 定义服务器列表
servers=(server1.example.com server2.example.com server3.example.com)
# 定义子脚本路径
sub_script1="/path/to/sub_script1.sh"
sub_script2="/path/to/sub_script2.sh"
sub_script3="/path/to/sub_script3.sh"
# 并行执行子脚本并收集输出
for ((i = 0; i < ${#servers[@]}; i++)); do
case $i in
0) script=$sub_script1 ;;
1) script=$sub_script2 ;;
2) script=$sub_script3 ;;
esac
pssh -h <(echo ${servers[$i]}) -i "bash $script" &> output_${servers[$i]}.log &
done
# 等待所有任务完成
wait
在上述脚本中:
- 定义了一个服务器列表
servers
。 - 定义了不同的子脚本路径。
- 使用
pssh
工具并行地在每台服务器上执行相应的子脚本,并将输出重定向到以服务器名命名的日志文件中。
2. 优化任务调度以提高执行效率
- 任务分组:根据服务器的资源(如CPU、内存)和任务的资源需求,将任务分配到合适的服务器上。例如,资源消耗大的任务分配到配置高的服务器。
- 并发控制:通过设置
parallel-ssh
的并发数参数(-p
)来控制同时执行的任务数量。如果并发数过高,可能会导致网络拥塞和服务器负载过高。可以根据网络带宽和服务器性能调整该参数。例如,pssh -p 10 -h <(echo ${servers[$i]}) -i "bash $script"
表示同时最多执行10个任务。 - 预取数据:如果子脚本需要从共享存储或网络获取数据,可以提前将数据缓存到本地服务器,减少执行时的网络I/O等待时间。
3. 处理网络故障和服务器异常情况
- 重试机制:在脚本中添加重试逻辑。例如,如果
pssh
执行失败,可以使用while
循环进行重试。
#!/bin/bash
# 定义服务器列表
servers=(server1.example.com server2.example.com server3.example.com)
# 定义子脚本路径
sub_script1="/path/to/sub_script1.sh"
sub_script2="/path/to/sub_script2.sh"
sub_script3="/path/to/sub_script3.sh"
for ((i = 0; i < ${#servers[@]}; i++)); do
case $i in
0) script=$sub_script1 ;;
1) script=$sub_script2 ;;
2) script=$sub_script3 ;;
esac
retries=3
while [ $retries -gt 0 ]; do
pssh -h <(echo ${servers[$i]}) -i "bash $script" &> output_${servers[$i]}.log
if [ $? -eq 0 ]; then
break
fi
retries=$((retries - 1))
sleep 5
done
if [ $retries -eq 0 ]; then
echo "Failed to execute script on ${servers[$i]} after multiple retries"
fi
done
- 监控和报警:使用监控工具(如Prometheus + Grafana)来实时监控服务器的状态和任务执行情况。可以设置阈值,当出现网络故障或服务器异常时,通过邮件、短信等方式发送报警信息。
- 容错设计:在子脚本中编写健壮的代码,例如使用
set -e
使脚本在遇到错误时立即退出,避免错误积累。同时,对子脚本中的关键操作添加日志记录,方便排查问题。