通常のファイル 'filename'を作成できません:ファイルが存在します


23

ビルドスクリプトの1つでこの奇妙なエラーメッセージが表示されています- cp失敗し、「ファイルが存在します」というエラーを返します。を使用してみましたがcp -f、ファイルが存在する場合は上書きするはずですが、エラーが表示されます。cp手動で実行すると、既存のファイルを上書きするために実行すると完全に機能します。このエラーの原因は何ですか?

回答:


25

これは、競合状態が原因であることが判明しました。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 ... || echo "skip copying due to other thread"。または似たような...
icfantv

単一の実行中に、私はこの問題をヒットcp
ZhaoGang

同じ問題に遭遇しました。どのようにデバッグしましたか?
CIsForCookies

失敗の痕跡を得たcp
19:25の
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.