como pode um arquivo ser removido e então o cp não pode escrevê-lo?

1

Eu tenho uma parte de um script bash, que estou executando como root:

rm -f ../../include/profile.h; \
cp profile.h ../../include/profile.h

o arquivo ../../include/profile.h em questão tem permissões:

-rw-r--r-- 1 root root 12178 Nov  5 02:00 ../../include/profile.h

Na maioria das vezes, o snippet é executado bem, mas muito raramente, impossível de reproduzir, ele falha:

cp: cannot create regular file '../../include/profile.h': File exists

Eu verifiquei, não há outra parte do programa, que seria executada em paralelo, o que poderia escrever o arquivo entre as duas declarações, criando assim uma condição de corrida que explicaria o comportamento. Não há outro lugar além do acima, que é executado apenas uma vez, o que escreveria este arquivo.

O sistema é

kernel:

Linux dev64 2.6.32.63+drm33.26-64.128-a10 #6 SMP Fri Jul 25 15:21:56 PDT 2014 x86_64 x86_64 x86_64 GNU/Linux

distro:

CentOS release 6.3 (Final)

O que poderia possivelmente causar essa falha?

    
por user322908 13.12.2015 / 03:35

1 resposta

0

Use

strace cp profile.h ../../include/profile.h 2>logfile

e procure:

stat("../../include/profile.h", 0x7ffdca347950) = -1 ENOENT (No such file or directory)
open("../../include/profile.h", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4

Isso vai dizer o que está acontecendo. Neste exemplo o arquivo não existia antes do cp (que ele determinou), daí o O_CREAT | O_EXCL.

    
por 13.12.2015 / 14:30

Tags