如何在shell中随机选择第一台机器?

时间:2018-04-29 06:13:40

标签: linux bash shell random scp

我有三台远程机器(machineA,machineB,machineC),我可以从中复制文件。如果由于某种原因我无法从machineA复制,那么我应该从machineB复制,如果由于某种原因我无法从machineB复制,然后从machineC开始复制。

下面是我所拥有的单shell命令,我需要在许多机器上运行它,但它意味着在所有这些机器上,它将仅从machineA复制。

(ssh goldy@machineA 'ls -1 /process/snap/20180418/*' | parallel -j5 'scp goldy@machineA:{} /data/files/') || (ssh goldy@machineB 'ls -1 /process/snap/20180418/*' | parallel -j5 'scp goldy@machineB:{} /data/files/') || (ssh goldy@machineC 'ls -1 /process/snap/20180418/*' | parallel -j5 'scp goldy@machineC:{} /data/files/')

现在有什么方法可以随机选择第一台机器(在这三台机器中),而不是始终保持machineA。那么随机选择第一台机器并保留其他两台机器作为备用机器第一台机器停机?这可能吗?

更新

我有这样的事情:

  machines=(machineA machineB machineC)
  for machine in $(shuf -e ${machines[@]}); do
      ssh -o StrictHostKeyChecking=no david@$machine 'ls -1 /process/snap/{{ folder }}/*' | parallel -j{{ threads }} 'scp -o StrictHostKeyChecking=no david@${machine}:{} /data/files/'
      [ $? -eq 0 ] && break
  done

2 个答案:

答案 0 :(得分:1)

如何将机器名称保存在文件中并使用shuf来洗牌?然后你可以创建一个这样的脚本:

<?php
//Database credentials
$dbHost     = 'localhost';
$dbUsername = 'root';
$dbPassword = '';
$dbName     = 'library';

//Connect and select the database
$db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName);

if ($db->connect_error) {
    die("Connection failed: " . $db->connect_error);
}
?>

这样的机器文件:

while read machine; do
    ssh goldy@$machine 'ls -1 /process/snap/20180418/*' | parallel -j5 "scp goldy@$machine:{} /data/files/"
    if [ $? == 0 ]; then
        break
    fi
done

并像这样调用脚本:

machineA
machineB
machineC

这是一个测试版本,除了显示逻辑如何工作之外什么都不做:

shuf machines | ./script.sh

解决你的评论,改为使用数组并将所有内容放在一行:

while read machine; do echo ssh goldy@$machine 'ls -1 /process/snap/20180418/*' echo parallel -j5 "scp goldy@$machine:{} /data/files/" executenonexistingcommand if [ $? == 0 ]; then break fi done 随机播放一个数组。要将其读回数组,您需要将outpu输入shuf -e ${machines[@]}。将脚本转换为单行只是将分号放在我们之前有换行的地方。

readarray

答案 1 :(得分:1)

以下是一个关于如何做到这一点的小例子 - 主要是评论,以显示我在想什么,但你可以删除它们以使其简洁。

m.ph = Param(initialize = 2, within = Integers)

因此,您可以将命令放在#!/bin/bash # Machine names, number of machines, random starting index machines=("machineA" "machineB" "machineC") num=${#machines[@]} idx=$((RANDOM%num)) # Make one try per machine, break on success for ((try=0;try<num;try++)) ; do this=${machines[$idx]} echo $this ((idx=(idx+1)%num)) done 的位置,并按照以下步骤操作:

echo $this

示例输出

[ $? -eq 0 ] && break

如果你有./go machineB machineC machineA ,你可以更简洁地做同样的事情:

shuf