如何在Shell中随机选三台机器首台及实现多机器故障转移拷贝
我来帮你搞定这两个Shell需求,分两部分给你详细拆解:
需求一:从三台机器中随机选出第一台
最简单的方式是把机器名存进数组,再借助随机数或者shuf工具来挑出第一台。这里给你两种实用写法:
第一种用Shell内置的RANDOM变量:
# 定义机器列表 machines=("machineA" "machineB" "machineC") # 生成随机索引,取模数组长度保证在合法范围内 random_idx=$((RANDOM % ${#machines[@]})) random_first=${machines[$random_idx]} echo "随机选中的机器:$random_first"
第二种用shuf命令(更直观易读):
# 直接通过管道随机选一行机器名 random_first=$(echo -e "machineA\nmachineB\nmachineC" | shuf -n1) echo "随机选中的机器:$random_first"
两种方法都能实现随机选第一台的效果,选你顺手的就行。
需求二:故障转移式文件拷贝(A→B→C自动切换)
你原来的命令只会固定用machineA,要实现故障转移,核心是先依次验证每台机器的可用性,找到第一个能正常访问的机器后再执行拷贝。这里给你写一个完整的脚本,完美适配你的场景:
# 按优先级定义机器列表(先A,再B,最后C) machines=("machineA" "machineB" "machineC") # 目标文件所在的远程目录 remote_dir="/process/snap/20180418/" # 用来存储最终选中的可用机器 selected_machine="" # 遍历机器列表,逐个测试可用性 for machine in "${machines[@]}"; do echo "正在测试机器:$machine" # 测试逻辑:通过ssh执行ls命令,能成功列出目录说明机器可用 if ssh -q goldy@"$machine" "ls -1 $remote_dir" >/dev/null 2>&1; then selected_machine="$machine" echo "✅ 机器$machine可用,将使用它进行拷贝" break else echo "❌ 机器$machine不可用,尝试下一台" fi done # 如果找到可用机器,执行批量拷贝 if [ -n "$selected_machine" ]; then # 获取远程文件列表,并行拷贝到本地(保持你原来的parallel并发数) ssh goldy@"$selected_machine" "ls -1 $remote_dir" | parallel -j5 "scp goldy@$selected_machine:{} ." echo "拷贝完成!" else echo "❌ 所有机器都无法访问,拷贝失败" exit 1 fi
关键细节说明:
- 测试环节用
ssh -q(静默模式),把输出重定向到/dev/null避免干扰,只关注命令执行的返回值 - 用
ls -1 $remote_dir作为测试条件,既验证了ssh连通性,也确认了目标目录存在且有访问权限,比单纯测试ssh连接更严谨 - 找到可用机器后,复用你原来的
parallel逻辑,保证拷贝效率
内容的提问来源于stack exchange,提问作者user1950349
相关产品推荐
相关产品推荐

