Eu preciso copiar os arquivos de machineB
e machineC
para machineA
. Estou executando meu script de shell abaixo do machineA
. Eu configurei as chaves ssh corretamente.
Se os arquivos não estiverem em machineB
, então deverão estar em machineC
. Preciso mover todos os ARQUIVOS PARTITION1 E PARTITION2 para a respectiva pasta machineA, conforme mostrado abaixo em meu script de shell -
#!/bin/bash
readonly PRIMARY=/export/home/david/dist/primary
readonly SECONDARY=/export/home/david/dist/secondary
readonly FILERS_LOCATION=(machineB machineC)
readonly MAPPED_LOCATION=/bat/data/snapshot
PARTITION1=(0 3 5 7 9)
PARTITION2=(1 2 4 6 8)
dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
length1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} "ls '$dir1' | wc -l")
length2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} "ls '$dir2' | wc -l")
if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ]
then
rm -r $PRIMARY/*
rm -r $SECONDARY/*
for el in "${PARTITION1[@]}"
do
scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
done
for sl in "${PARTITION2[@]}"
do
scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.
done
fi
Atualmente, estou tendo 5 arquivos em PARTITION1 E PARTITION2, mas em geral terá cerca de 420 arquivos, o que significa que irá mover os arquivos um por um, o que acho que pode ser bem lento. Existe alguma maneira de acelerar o processo?
Estou executando o Ubuntu 12.04
Responder1
Paralelizar o SCP é contraproducente, a menos que ambos os lados sejam executados em SSDs. A parte mais lenta do SCP é murchar a rede, caso em que a paralelização não ajudará em nada, ou os discos de ambos os lados, o que você piorará com a paralelização: o tempo de busca vai te matar.
Você diz que a máquina A está no SSD, então paralelizar por máquina deve ser suficiente. A maneira mais simples de fazer isso é agrupar o primeiro forloop em um subshell e colocá-lo em segundo plano.
( for el in "${PARTITION1[@]}"
do
scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
done ) &
Responder2
Você poderia usar o GNU Parallel para ajudá-lo a executar múltiplas tarefas em paralelo.
No entanto, na sua situação, parece que você está estabelecendo uma conexão segura separada para cada transferência de arquivos, o que provavelmente é bastante ineficiente, especialmente se as outras máquinas não estiverem em uma rede local.
A melhor abordagem seria usar uma ferramenta que faça especificamente a transferência de arquivos em lote - por exemplo, rsync
, que também pode funcionar em ssh simples.
Se o rsync não estiver disponível, como alternativa, você poderá usar zip
, ou mesmo tar
e gzip
ou bzip2
, e então scp
os arquivos resultantes (em seguida, conecte-se com ssh
e faça a descompactação).
Responder3
Já tive problema com o scp, duas máquinas na mesma rede com conexão Gigabit que estavam transferindo muito lentamente pelo scp.
Se você NÃO precisa de criptografia, com certeza ajudará um pouco usar FTP ou NFS.
Descobri que o problema era que uma das máquinas tinha RAM lenta e a parte da criptografia ssh era muito exigente para esta máquina. Usar FTP ou NFS resolveu meu problema, passei de 15-20 MB/s para mais de 100 MBps.
[EDITAR]
Acabei de encontrar isto que usa o excelente rsync em vez de scp. Não resolve todo o seu problema, mas pode ajudar.