inotifywaitअब तक दिए गए कुछ- आधारित दृष्टिकोणों के साथ कुछ समस्याएं हैं:
- वे एक
sleep.txtफ़ाइल खोजने में विफल रहते हैं जिसे पहले अस्थायी नाम के रूप में बनाया गया है और फिर नाम बदल दिया गया है sleep.txt। एक के moved_toअलावा घटनाओं के लिए मैच की जरूरत हैcreate
- फाइल के नाम में न्यूलाइन कैरेक्टर हो सकते हैं, न्यूलाइन सीमांकित फाइलों के नाम प्रिंट करना यह निर्धारित करने के लिए पर्याप्त नहीं है कि क्या
sleep.txtबनाया गया है। क्या होगा अगर एक foo\nsleep.txt\nbarफ़ाइल उदाहरण के लिए बनाई गई है?
- क्या होगा यदि फ़ाइल शुरू होने से पहले बनाई गई है
inotifywaitऔर घड़ी स्थापित की गई है? फिर inotifywaitपहले से ही यहां मौजूद एक फाइल के लिए हमेशा के लिए इंतजार करना होगा। आपको यह सुनिश्चित करने की आवश्यकता होगी कि घड़ी स्थापित होने के बाद फ़ाइल पहले से ही वहां नहीं है।
- कुछ समाधान
inotifywaitचल रहे हैं (कम से कम जब तक एक और फ़ाइल नहीं बनाई जाती है) फ़ाइल मिलने के बाद।
उन लोगों को संबोधित करने के लिए, आप कर सकते हैं:
sh -c 'echo "$$" &&
LC_ALL=C exec inotifywait -me create,moved_to --format=/%f/ . 2>&1' | {
IFS= read pid &&
while IFS= read -r line && [ "$line" != "Watches established." ]; do
: wait for watches to be established
done
[ -e sleep.txt ] || [ -L sleep.txt ] || grep -qxF /sleep.txt/ && kill "$pid"
}
ध्यान दें कि हम sleep.txtवर्तमान निर्देशिका में निर्माण के लिए देख रहे हैं , .(इसलिए आप cd /tmp || exitअपने उदाहरण से पहले ऐसा करेंगे )। वर्तमान निर्देशिका कभी नहीं बदलती है, इसलिए जब वह पाइप लाइन सफलतापूर्वक लौटती है, तो यह sleep.txtवर्तमान निर्देशिका में है जो बनाई गई है।
बेशक, आप बदल सकते हैं .के साथ /tmpऊपर है, लेकिन, जबकि inotifywaitचल रहा है, /tmpकई बार नाम बदला जा सकता था (के लिए की संभावना नहीं /tmpहै, लेकिन सामान्य मामले में विचार करने के लिए कुछ) या एक नया फाइल सिस्टम उस पर घुड़सवार, इसलिए जब पाइप लाइन रिटर्न, यह नहीं हो सकता एक है /tmp/sleep.txtकि बनाया गया है, लेकिन /new-name-for-the-original-tmp/sleep.txtइसके बजाय। /tmpअंतराल में एक नई निर्देशिका भी बनाई जा सकती थी और उस पर किसी की नजर नहीं जाती थी, इसलिए sleep.txtबनाए गए का पता नहीं चलता।
$MAILPATH।