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).