kann keine reguläre Datei 'Dateiname' erstellen: Datei existiert

22

Ich habe diese seltsame Fehlermeldung in einem meiner Build-Skripte erhalten - cpschlägt fehl und meldet den Fehler "Datei existiert". Ich habe sogar versucht mit cp -f, die Datei zu überschreiben, wenn es existiert, aber der Fehler wird immer noch angezeigt. Das Ausführen cp, um vorhandene Dateien zu überschreiben, funktioniert einwandfrei, wenn ich es manuell mache. Was könnte diesen Fehler verursachen?

Lutzky
quelle

Antworten:

24

Dies wurde durch eine Rennbedingung verursacht. cpüberprüft, ob die Zieldatei bereits vorhanden ist, und überschreibt sie, falls nicht. Das Problem trat auf, weil dieser cpBefehl zweimal parallel ausgeführt wurde, was dazu führte, dass die betreffende Datei manchmal angezeigt wurde, nachdem überprüft wurde, ob sie vorhanden ist, aber bevor versucht wurde, die Datei zu erstellen. Die straceAusgabe sieht folgendermaßen aus:

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

Hier ist ein Bash-Code, der verwendet wird, um dies zu erfassen:

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

Derselbe Fehler kann bei mkdir -poder bei jeder anderen Aktion auftreten, die versucht, eine Datei zu überschreiben. Mit flockkönnen Sie in solchen Fällen Rennbedingungen vermeiden.

Lutzky
quelle
Genau in diese Situation bin ich geraten. Ich entschied mich dafür, es über den ||Operator abzuwickeln. Eine Art Versuch / Fang eines Armen. Dh cp ... || echo "skip copying due to other thread". Oder etwas Ähnliches ...
icfantv
Ich bin auf dieses Problem cp
gestoßen, als
Bin auf dasselbe Problem gestoßen. Wie haben Sie es debuggt?
CIsForCookies
Ich habe eine Spur von dem Versagen cp.
Lutzky