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/