O cenário é o seguinte: A Máquina A tem arquivos que eu quero copiar para a Máquina C. A Máquina A não pode acessar diretamente o C, mas pode acessar a Máquina B que pode acessar a Máquina C. Estou usando o scp para copiar da Máquina A para B e depois de B para C.
A máquina B tem espaço de armazenamento limitado, portanto, à medida que os arquivos chegam, eu preciso copiá-los para C e excluí-los de B. A segunda cópia é muito mais rápida, portanto, isso não é problema com a largura de banda.
Eu poderia fazer isso manualmente, mas sou preguiçosa. O que eu gostaria é executar um script em B ou C que irá copiar cada arquivo para C como cada um termina . O trabalho scp está sendo executado de A.
Então, o que eu preciso é uma maneira de perguntar (de preferência de um script bash) se o arquivo X.avi é "feito" copiando. Cada um desses arquivos tem um tamanho diferente e não posso prever o tamanho ou o tempo de conclusão.
Edit: a propósito, os tempos de transferência de arquivos são de cerca de 1 hora de A para B e cerca de 10 minutos de B para C, se a escala de tempo for importante.
scp * user@host:~/
e os arquivos que estão sendo copiados iriam mais do que encher a máquina B, então não posso mover / renomear arquivos depois que eles são copiados de A.Faz
lsof
na máquina B mostra que scp tem o arquivo aberto? se assim for, você poderia assistirlsof
e veja quando scp fecha o arquivo. Caso contrário, você poderá observar o tamanho do arquivo e depois de não ter mudado por um determinado período de tempo (5 minutos, por exemplo), copiá-lo de B para C.Uma terceira opção seria copiar os arquivos de A para um diretório "in_progress" em C. Depois que a cópia terminar em A, execute um
mv
comando para sair do diretório "in_progress".fonte
lsof
não parece existir na máquina B. Sobre sua terceira opção, isso não funcionará, porque se eu deixar a cópia terminar antes de fazer qualquer coisa, eu vou sobrecarregar meu espaço permitido em B (algo como 10: 1). Então, qualquer solução que eu tenha que trabalhar durante a cópia.Acabei de pensar em outra opção completamente diferente. Não usa scp em tudo. Por favor, deixe-me saber se isso funcionaria:
em B, crie um pipe fifo em algum lugar: mkfifo / tmp / xfer
em A, não use scp,
tar -cz files | ssh B 'cat > /tmp/xfer
em C, corra
ssh B 'cat /tmp/xfer' | tar -xz
Dessa forma, os dados não são armazenados em B, apenas passam pelo cano. A desvantagem disso é que você só pode ter uma cópia por vez ...
Você precisará garantir que o processo em C reapareça toda vez que terminar.
fonte
Depois de pensar sobre as respostas postadas (em particular a idéia do @ Josh de assistir tempos modificados) eu estava tentando executar manipular os arquivos de B em C. Veja, B é anêmico quanto às ferramentas disponíveis, então nada que parecesse ser capaz de fazer o trabalho estava lá. Eu cheguei a essa solução. Esta ideia não é minha, encontrei-a nas pesquisas do Google antes desta questão. Eu descartei isso antes, já que a máquina B não tinha
find
utilidade.Primeiro, monte o diretório apropriado em B em C, para que ele apareça como um sistema de arquivos local. eu usei
sshfs
para isso (ferramenta incrível, por sinal). Isso me permitirá usar os utilitários do C ao invés do B's.Em segundo lugar, o comando
find /the/folder/* -mmin +5
corresponderá a todos os arquivos modificados há mais de 5 minutos. Então o comandofind /the/folder/* -mmin +5 -exec {} /the/other/folder \;
moverá todos os arquivos que foram modificados há mais de 5 minutos para a outra pasta (que é na realidade em C, em vez de sshfs montado em B.Finalmente, eu configurei um cron script para executar o script acima a cada 10 minutos hoje e amanhã. A linha no meu crontab fica assim.
Espero que isso funcione. O próximo arquivo ainda não foi concluído, então não posso comentar se ele realmente funciona quando combinado com o script cron, mas fiz alguns arquivos manualmente e os semeei e eles se moveram bem. cruzar meus dedos
Edit: Isso está funcionando, embora como foi originalmente teve alguns erros, aqueles são corrigidos agora.
fonte
Não há necessidade de mkfifo. Na máquina B, execute isto:
Você pode achar útil a opção -C do tar.
Se você precisar iniciar a cópia na máquina A, faça:
Cuidado com a citação adequada, no entanto.
fonte
A cópia será executada como outro processo ou você poderá forçá-la, usando uma subcamada. Então, você poderia usar ps para "assistir" o processo e ver quando ele desaparece.
Além disso, acredito que no * nix, você pode excluir o arquivo enquanto ele está sendo copiado. O sistema não irá apagá-lo até que o programa de cópia o feche. Claro, se a cópia não for bem sucedida, você perde o arquivo, portanto, não é a melhor ideia.
fonte