回答:
これは、競合状態が原因であることが判明しました。cp
宛先ファイルがすでに存在するかどうかを確認し、存在しない場合は上書きします。問題は、このcp
コマンドが2回並行して実行されたために発生していました。そのため、問題のファイルが存在するかどうかを確認した後、ファイルを作成する前に表示されることがありました。strace
出力は次のようになります。
# 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)
これをキャッチするために使用するいくつかのbashコードを次に示します。
#!/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
この同じエラーはmkdir -p
、ファイルを上書きしようとする、または他のアクションで発生する可能性があります。を使用flock
すると、このような場合に競合状態を回避できます。
cp
cp
。
||
オペレーターを介して処理することにしました。貧乏人のトライ/キャッチの並べ替え。すなわち、cp ... || echo "skip copying due to other thread"
。または似たような...