Как скопировать файлы от локального центра обработки данных до локального центра обработки данных и иметь некоторые случаи обработки отказа?

Я смог успешно обновить:

yum --enablerepo remi install  mysql-server
4
02.04.2015, 01:15
2 ответа

Вытащил Foo.bar.baz. код .Provider.com Часть может быть легко сделана довольно легко в паре способа. Например:

datacenter="$(echo "$HOSTNAME" | rev | cut -d. -f3 | rev)"

Если имена ваших центров обработки данных не совпадают с простым шаблоном, вы можете использовать оператор Case , а совпадение на основе полных шаблонов оболочки:

case "$HOSTNAME" in
    *phx.provider.com)       DATACENTER="dc1" ;;
    *lax.otherprovider.com)  DATACETNER="dc2" ;;
    *.weirdness.*)           DATACENTER="dc3" ;;
    # ⋮
esac

для вашего обратного переборота, Вы должны решить, как вы собираетесь определить машину, снижается. Самый простой будет пробовать другую машину, если SCP возвращает ненулевое состояние выхода. Это то, что вы делаете с || .

(У вас есть еще несколько вещей, например, я уверен, что Parallel Call не будет работать, потому что он работает над командами, а не функциями оболочки)

3
27.01.2020, 20:52
$ inotifywait -m /tmp
Setting up watches.
Watches established.
/tmp/ CREATE file.ext.filepart
/tmp/ OPEN file.ext.filepart
/tmp/ MODIFY file.ext.filepart
/tmp/ CLOSE_WRITE,CLOSE file.ext.filepart
/tmp/ CREATE file.ext
/tmp/ DELETE file.ext.filepart

Transcript from running

$ echo hello >/tmp/file.ext.filepart
$ ln /tmp/file.ext.filepart /tmp/file.ext         
$ rm /tmp/file.ext.filepart

Перемещение файла создает событие move , но создание жесткой ссылки создает то же событие create , что и создание нового пустого файла (как и mkfifo и другие способы создания файлов).

Почему сервер SCP или SFTP создает жесткую ссылку, а затем удаляет временный файл, а не перемещает его на место? В исходном коде OpenSSH (portable 6,0), в sftp-server.c , в функции process _ rename , я вижу следующий код (переформатированный и упрощенный для иллюстрации части, которую я хочу показать):

if (S_ISREG(sb.st_mode)) {
    /* Race-free rename of regular files */
    if (link(oldpath, newpath) == -1) {
         if (errno == EOPNOTSUPP || errno == ENOSYS) {
            /* fs doesn't support links, so fall back to stat+rename.  This is racy. */
            if (stat(newpath, &st) == -1) {
                rename(oldpath, newpath) == -1)
            }
        }
    } else {
        unlink(newpath);
    }
}

То есть попытаться создать жесткую связь из временного имени файла к нужному имени файла, затем удалить временный файл. Если создание жесткой ссылки не работает, потому что ОС или файловая система не поддерживает это, вернитесь к другому методу: проверьте, существует ли нужный файл, и если нет, переименуйте временный файл. Таким образом, точка состоит в переименовании временного файла в его конечное местоположение без риска перезаписи файла, который мог быть создан во время копирования. Переименование не будет выполнено, поскольку rename перезаписывает целевой файл, если он существует.

-121--69369-

Ниже приведены примеры извлечения определенных файлов из файла tar.gz.

Из локального файла:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

Из удаленного URL:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
-121--3379-

Можно сделать что-то подобное, основываясь на ответе @ derobert:

#!/usr/bin/env bash

primary="/test01/primary" # copy primary_partition into this folder
secondary="/test02/secondary" # copy secondary_partition into this folder

holder_location_phx=("holdermachine.phx.host.com") # we might have more machines in future
holder_location_slc=("holdermachine.slc.host.com") # we might have more machines in future
holder_location_lvs=("holdermachine.lvs.host.com") # we might have more machines in future

primary_partition=(550 274 2 546 278) # this will have more file numbers and it is being passed from outisde
secondary_partition=(1643 1103 1372 1096 1369 1568) # this will have more file numbers and it is being passed from outisde

file_location="/batch/data/pk_snapshot"
file_timestamp="$file_timestamp"

dir3="$file_location"/"$file_timestamp"

# I need to delete before copying the files.
find "$primary" -mindepth 1 -delete
find "$secondary" -mindepth 1 -delete

## Find where we are and choose the primary and alternative
## targets accordingly.
case "$HOSTNAME" in
    *phx.host.com) 
        datacenter=("${holder_location_phx[@]}")
        alternative1=("${holder_location_slc[@]}")
        alternative2=("${holder_location_lvs[@]}")
        ;;
    *lax.host.com) 
        datacenter=("${holder_location_lax[@]}")
        alternative1=("${holder_location_phx[@]}")
        alternative2=("${holder_location_lvs[@]}")
        ;;

    *lvs.host.com) 
        datacenter=("${holder_location_lvs[@]}")
        alternative1=("${holder_location_slc[@]}")
        alternative2=("${holder_location_phx[@]}")
        ;;

    *) echo "uknown host, exiting." && exit 1 ;;
    # ⋮
esac

do_copy() {
  el=$1
  primsec=$2
  scp david@"${datacenter[0]}":"$dir3"/new_weekly_2014_"$el"_200003_5.data "$primsec"/ || scp david@"${alternative1[0]}":"$dir3"/new_weekly_2014_"$el"_200003_5.data "$primsec"/ || scp david@"${alternative2[0]}":"$dir3"/new_weekly_2014_"$el"_200003_5.data "$primsec"/
}

export -f do_copy

# copying 10 files in parallel simultaneously in primary and secondary folder
parallel --retries 10 -j 10 do_copy {} "$primary" ::: "${primary_partition[@]}" &
parallel --retries 10 -j 10 do_copy {} "$secondary" ::: "${secondary_partition[@]}" &
wait    

echo "all files copied."

Обратите внимание, что я совсем не уверен, что ваш параллельный вызов будет работать. Я также исправил некоторые другие проблемы в вашем сценарии и немного упростил его. Я сохранил структуру массива с тех пор, как вы упомянули, что, возможно, вы захотите расширить ее до большего числа серверов позже. Обратите внимание, что в этом случае необходимо закольцовывать имена серверов, сохраненные в массивах. На данный момент я просто использую первый элемент в каждом из них (например, $ {datacenter [0]} ).

3
27.01.2020, 20:52

Теги

Похожие вопросы