não é possível criar o arquivo regular 'filename': o arquivo existe

23

Eu recebi essa mensagem de erro estranha em um dos meus scripts de compilação - cpfalha, retornando o erro "O arquivo existe". Eu até tentei usar cp -f, que deve substituir o arquivo, se ele existir, mas o erro ainda aparece. Correr cppara substituir arquivos existentes funciona perfeitamente quando eu o faço manualmente. O que poderia causar esse erro?

lutzky
fonte

Respostas:

25

Isso acabou sendo causado por uma condição de corrida. cpverifica se o arquivo de destino já existe e, se não - o substitui. O problema estava acontecendo porque esse cpcomando estava sendo executado duas vezes em paralelo, o que fazia com que o arquivo em questão às vezes aparecesse após verificar se ele existe, mas antes da tentativa de criar o arquivo. A stracesaída é assim:

# Command was "cp a b"
stat("b", 0x7fff89510620)               = -1 ENOENT (No such file or directory)
stat("a", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("b", 0x7fff895103a0)               = -1 ENOENT (No such file or directory)
# File b will be created at this point in time
open("a", O_RDONLY)                     = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
open("b", O_WRONLY|O_CREAT|O_EXCL, 0644) = -1 EEXIST (File exists)

Aqui está algum código bash usado para capturar isso:

#!/bin/bash

touch a

f() {
  while true; do
    rm -f b
    strace -o /tmp/cp${BASHPID}.trace cp a b || break
  done
}

cleanup() {
  kill -9 %1 %2
}

f &
f &

trap cleanup exit

wait

Esse mesmo erro pode ocorrer com mkdir -pou qualquer outra ação que tente sobrescrever um arquivo. O uso flockpode ajudar a evitar condições de corrida em casos como este.

lutzky
fonte
Eu encontrei exatamente essa mesma situação. Eu escolhi lidar com isso através do ||operador. Tipo de tentativa / captura de um pobre homem. Ou seja cp ... || echo "skip copying due to other thread",. Ou algo semelhante ...
icfantv
Eu bati este problema ao executar um singlecp
ZhaoGang
Deparou-se com o mesmo problema. Como você o depurou?
CIsForCookies
Tenho uma pista sobre o fracasso cp.
lutzky 10/10