नियमित फ़ाइल 'फ़ाइल नाम' नहीं बना सकते: फ़ाइल मौजूद है


23

मुझे अपनी बिल्ड स्क्रिप्ट में से एक में यह अजीब त्रुटि संदेश मिल रहा है - cpविफल, "फाइल मौजूद है" त्रुटि को वापस करना। मैंने भी उपयोग करने की कोशिश की है cp -f, जो कि मौजूद होने पर फ़ाइल को अधिलेखित कर देना चाहिए, लेकिन त्रुटि अभी भी दिखाई देती है। cpमौजूदा फ़ाइलों को अधिलेखित करने के लिए दौड़ना पूरी तरह से काम करता है जब मैं इसे मैन्युअल रूप से करता हूं। इस त्रुटि का क्या कारण हो सकता है?

जवाबों:


25

यह एक दौड़ की स्थिति के कारण निकला। cpयदि गंतव्य फ़ाइल पहले से मौजूद है, और यदि नहीं - तो इसे अधिलेखित कर देता है। समस्या इसलिए हो रही थी क्योंकि यह cpकमांड दो बार समानांतर रूप से चलाया जा रहा था, जिसके कारण प्रश्न में फ़ाइल कभी-कभी यह जाँचने के बाद दिखाई देती है कि क्या यह मौजूद है, लेकिन फ़ाइल बनाने के प्रयास से पहले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)

यहां इसे पकड़ने के लिए कुछ बैश कोड का उपयोग किया गया है:

#!/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
ज़ोहैंग

उसी समस्या में भाग गया। आपने इसे कैसे डीबग किया?
CIsForCookies

फेल होने पर एक स्ट्रेस मिला cp
lutzky
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.