से lsof
आदमी पेज
यदि कोई त्रुटि का पता चला है तो Lsof एक (1) देता है, जिसमें कमांड नाम, फ़ाइल नाम, इंटरनेट पते या फाइलें, लॉगिन नाम, एनएफएस फाइलें, पीआईडी, पीजीआईडी, या यूआईडी का पता लगाने में विफलता सहित यह सूची करने के लिए कहा गया था। यदि -V विकल्प निर्दिष्ट किया जाता है, तो lsof उन खोज आइटमों को इंगित करेगा जो इसे सूचीबद्ध करने में विफल रहे।
ताकि यह सुझाव दिया जाए कि आपके lsof failed for some other reason
खंड को कभी निष्पादित नहीं किया जाएगा।
क्या आपने अभी-अभी फ़ाइल को स्थानांतरित करने का प्रयास किया है जबकि आपकी बाहरी प्रक्रिया अभी भी खुली हुई है? यदि गंतव्य निर्देशिका एक ही फाइल सिस्टम पर है, तो ऐसा करने में कोई समस्या नहीं होनी चाहिए जब तक कि आपको मूल प्रक्रिया के तहत इसे तीसरी प्रक्रिया से एक्सेस करने की आवश्यकता न हो क्योंकि अंतर्निहित इनोड वही रहेगा। अन्यथा मुझे लगता है कि mv
वैसे भी विफल हो जाएगा।
यदि आपको फ़ाइल के साथ आपकी बाहरी प्रक्रिया समाप्त होने तक वास्तव में प्रतीक्षा करने की आवश्यकता है, तो आप बार-बार मतदान के बजाय एक कमांड का उपयोग करना बेहतर समझते हैं। लिनक्स पर, आप इसके लिए उपयोग कर सकते हैं inotifywait
। उदाहरण के लिए:
inotifywait -e close_write /path/to/file
यदि आपको उपयोग करना चाहिए lsof
(शायद पोर्टेबिलिटी के लिए), तो आप कुछ इस तरह की कोशिश कर सकते हैं:
until err_str=$(lsof /path/to/file 2>&1 >/dev/null); do
if [ -n "$err_str" ]; then
# lsof printed an error string, file may or may not be open
echo "lsof: $err_str" >&2
# tricky to decide what to do here, you may want to retry a number of times,
# but for this example just break
break
fi
# lsof returned 1 but didn't print an error string, assume the file is open
sleep 1
done
if [ -z "$err_str" ]; then
# file has been closed, move it
mv /path/to/file /destination/path
fi
अपडेट करें
जैसा कि नीचे @JohnWHSmith ने उल्लेख किया है , सबसे सुरक्षित डिज़ाइन हमेशा lsof
ऊपर दिए गए लूप का उपयोग करेगा क्योंकि यह संभव है कि एक से अधिक प्रक्रिया में फ़ाइल लिखने के लिए खुली होगी (उदाहरण का मामला खराब लिखित अनुक्रमण डेमन हो सकता है जो पढ़ने के साथ फाइल खोलता है। / झंडा लिखें जब इसे वास्तव में केवल पढ़ा जाना चाहिए)। inotifywait
नींद के बजाय अभी भी इस्तेमाल किया जा सकता है, बस स्लीप लाइन को बदल दें inotifywait -e close /path/to/file
।