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 cp
Befehl 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 strace
Ausgabe 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 -p
oder bei jeder anderen Aktion auftreten, die versucht, eine Datei zu überschreiben. Mit flock
können Sie in solchen Fällen Rennbedingungen vermeiden.
||
Operator abzuwickeln. Eine Art Versuch / Fang eines Armen. Dhcp ... || echo "skip copying due to other thread"
. Oder etwas Ähnliches ...