impossibile creare il normale file "nome file": il file esiste


23

Ho ricevuto questo strano messaggio di errore in uno dei miei script di build - cpnon riesce, restituendo l'errore "Il file esiste". Ho anche provato a utilizzare cp -f, che dovrebbe sovrascrivere il file se esiste, ma l'errore si presenta ancora. La corsa cpper sovrascrivere i file esistenti funziona perfettamente quando lo faccio manualmente. Cosa potrebbe causare questo errore?

Risposte:


25

Questo si è rivelato essere causato da una condizione di gara. cpcontrolla se il file di destinazione esiste già e, in caso contrario, lo sovrascrive. Il problema si stava verificando perché questo cpcomando veniva eseguito due volte in parallelo, il che faceva apparire il file in questione dopo aver verificato se esiste, ma prima del tentativo di creare il file. L' straceoutput è simile al seguente:

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

Ecco un po 'di codice bash usato per catturare questo:

#!/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

Questo stesso errore può verificarsi con mkdir -po qualsiasi altra azione che tenti di sovrascrivere un file. L'uso flockpuò aiutare a evitare le condizioni di gara in casi come questo.


Mi sono imbattuto in questa stessa identica situazione. Ho scelto di gestirlo tramite l' ||operatore. Una specie di tentativo / cattura di un poorman. Vale a dire, cp ... || echo "skip copying due to other thread". O qualcosa di simile ...
icfantv

Ho cp
riscontrato

Si è imbattuto nello stesso problema. Come hai eseguito il debug?
CIsForCookies,

Ho una traccia del fallimento cp.
Lutzky,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.