Você precisa usar um cadeado; Se você estiver executando o Linux e tiver flock (parte de util-linux ), é tão simples quanto
scp file.bin remoteserver:/foo/$type/
(
flock 9
grep -v "oldfile.bin" entries.log > entries.log.backup && mv entries.log.backup entries.log
echo "$record" >> entries.log
) 9>entries.log.lock
Isso copiará o arquivo, aguardará a aquisição do bloqueio e atualizará o log exclusivamente. Eu estou supondo que você queria anexar ao log.
A ideia aqui é usar entries.log.lock como um arquivo de bloqueio (não podemos usar o arquivo de registro em si, já que o substituiremos). 9>entries.log.lock cria o arquivo se necessário e associa o descritor de arquivo 9 a ele, na subshell que executará os comandos entre parênteses. flock 9 obtém um bloqueio no arquivo apontado pelo descritor de arquivo 9, esperando se necessário; o bloqueio permanecerá retido até que o descritor de arquivo seja fechado, o que acontecerá quando a sub-rede for encerrada. grep , mv e echo então procedem sob o bloqueio.
Processos simultâneos serão capazes de scp em paralelo, mas a manipulação de log será serializada.
Se você não tiver flock , Quais comandos Unix podem ser usados como um semáforo / bloqueio? tem várias alternativas (a abordagem mkdir funcionará em todos os lugares).