Acho que a melhor coisa é garantir que o processo B copie apenas arquivos que foram totalmente transferidos pelo processo A. Uma maneira de fazer isso seria usar uma combinação de cp
e mv
no processo A, já que o processo mv
usa a chamada de sistema rename
(desde que os arquivos estejam no mesmo sistema de arquivos) que é atômico. Isso significa que, da perspectiva do processo B, os arquivos aparecem em seu estado totalmente formado.
Uma maneira de implementar isso seria ter um diretório partial
dentro do diretório /backup
, que é ignorado pelo processo B. Para o processo A, você poderia fazer algo como:
file="some_wal_file"
cp pg_xlog/"$file" /backup/partial
mv /backup/partial/"$file" /backup
E para o processo B (usando bash
):
shopt -s extglob
scp /backup/!(partial) user@remote-machine:/backups/
Embora o programa que você provavelmente deseja examinar, tanto para o processo A como para o processo B, seja rsync
. rsync
cria arquivos parciais e atua atomicamente por padrão (embora geralmente os arquivos parciais sejam arquivos ocultos em vez de estarem em um diretório específico). O Rsync também evita a transferência de arquivos que não é necessário e possui um algoritmo delta especial para transferir apenas partes relevantes dos arquivos que precisam ser atualizados pela rede ( rsync
deve ser instalado em ambos os locais, embora as transferências ainda sejam acima de ssh
por padrão). Usando rsync
para o processo A:
rsync -a --partial-dir=/backup/partial pg_xlog/some_wal_file /backup/
Para o processo B:
rsync -a --exclude=/partial/ /backup/ user@remote-machine:/backups/