मैं एक शेल स्क्रिप्ट पर काम कर रहा हूं, जो केवल txt फ़ाइल पर कुछ परिवर्तन करता है यदि यह मौजूद है, हालांकि यह परीक्षण लूप काम नहीं करता है, मुझे आश्चर्य है कि क्यों? धन्यवाद!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
मैं एक शेल स्क्रिप्ट पर काम कर रहा हूं, जो केवल txt फ़ाइल पर कुछ परिवर्तन करता है यदि यह मौजूद है, हालांकि यह परीक्षण लूप काम नहीं करता है, मुझे आश्चर्य है कि क्यों? धन्यवाद!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
जवाबों:
जब आप कहते हैं कि "काम नहीं करता है", तो आप कैसे जानते हैं कि यह काम नहीं करता है?
यदि फ़ाइल वास्तव में जोड़कर मौजूद है, तो आप यह पता लगाने की कोशिश कर सकते हैं:
while [ ! -f /tmp/list.txt ]
do
sleep 2 # or less like 0.2
done
ls -l /tmp/list.txt
आप यह भी सुनिश्चित कर सकते हैं कि आप 'इको $ शेल' लिखकर बैश (या संबंधित) शेल का उपयोग कर रहे हैं। मुझे लगता है कि CSH और TCSH इस लूप के लिए थोड़ा अलग अर्थ का उपयोग करते हैं।
while [ ! -f /tmp/list.txt ]; do sleep 2; done; ls -l /tmp/list.txt
यदि आप linux पर हैं और इनोटिफ़ाइ-टूल्स स्थापित हैं, तो आप यह कर सकते हैं:
file=/tmp/list.txt
while [ ! -f "$file" ]
do
inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done
यह हर "एक्स" सेकंड को मतदान करते समय नींद से शुरू की गई देरी को कम करता है। आप अधिक घटनाओं को जोड़ सकते हैं यदि आप अनुमान लगाते हैं कि उनकी आवश्यकता है।
--excludeफ़ाइल नाम को फ़िल्टर करना है, लेकिन फ़ाइल नाम के अलावा--include सब कुछ अनदेखा नहीं करना है । उपर्युक्त आदेश को यद्यपि के बजाय तर्क का उपयोग करना चाहिए । -qq>&/dev/null
--timeout, चेकिंग की फ्रीक्वेंसी, नहीं? Inotifywait की बात यह है कि कोई मतदान नहीं है
inotifywaitअनिश्चित काल तक लटका रह सकता है यदि कोई फ़ाइल घटनाओं को सुनने से ठीक पहले बनाई जाती है।
मैं एक ही समस्या थी, डाल! कोष्ठक के बाहर;
while ! [ -f /tmp/list.txt ];
do
echo "#"
sleep 1
done
इसके अलावा, यदि आप लूप के अंदर एक इको जोड़ते हैं तो यह आपको बताएगा कि आप लूप में आ रहे हैं या नहीं।
मैं एक समान मुद्दे में भाग गया और इसने मुझे यहां तक पहुंचाया, इसलिए मैं किसी ऐसे व्यक्ति के लिए अपना समाधान छोड़ना चाहता था जो समान अनुभव करता हो।
मैंने पाया कि अगर मैं भागा cat /tmp/list.txtतो फ़ाइल खाली होगी, भले ही मैं निश्चित था कि वहाँ सामग्री तुरंत फ़ाइल में रखी जा रही थी। अगर यह उम्मीद के sleep 1;मुताबिक cat /tmp/list.txtकाम करता है, तो मैं इससे पहले ही बाहर हो जाता हूं । फ़ाइल के निर्माण के समय और उसके लिखे जाने के समय, या उन रेखाओं के साथ कुछ होने में देरी हुई होगी।
मेरा अंतिम कोड:
while [ ! -f /tmp/list.txt ];
do
sleep 1;
done;
sleep 1;
cat /tmp/list.txt;
आशा है कि यह किसी को निराश करने वाले आधे घंटे को बचाने में मदद करता है!
@ ज़ैन-हूपर की तरह, मुझे एनएफएस पर समान समस्या थी। समानांतर / वितरित फाइलसिस्टम पर आपके बीच एक मशीन पर एक फाइल बनाने और दूसरी मशीन को "देखने" के लिए अंतराल "यह बहुत बड़ा हो सकता है, इसलिए मैं लूप के बाहर निकलने से पहले फ़ाइल के निर्माण के बाद एक पूर्ण मिनट तक इंतजार कर सकता हूं (और वहाँ भी एक "पहले से ही नष्ट कर दिया फ़ाइल" देख "" के बाद है।
यह भ्रम पैदा करता है कि स्क्रिप्ट "काम नहीं करती है" , जबकि वास्तव में यह फाइलसिस्टम है जो गेंद को गिरा रहा है।
मुझे यह पता लगाने में थोड़ा समय लगा, आशा है कि यह किसी को कुछ समय बचाता है।
PS यह भी "बासी फ़ाइल हैंडलर" त्रुटियों की एक कष्टप्रद संख्या का कारण बनता है।
बाश और श दोनों के साथ काम करता है:
touch /tmp/testfile
sleep 10 && rm /tmp/testfile &
until ! [ -f /tmp/testfile ]
do
echo "testfile still exist..."
sleep 1
done
echo "now testfile is deleted.."
यहां टाइमआउट के साथ एक संस्करण दिया गया है ताकि एक समय के बाद लूप एक त्रुटि के साथ समाप्त हो जाए:
# After 60 seconds the loop will exit
timeout=60
while [ ! -f /tmp/list.txt ];
do
# When the timeout is equal to zero, show an error and leave the loop.
if [ "$timeout" == 0 ]; then
echo "ERROR: Timeout while waiting for the file /tmp/list.txt."
exit 1
fi
sleep 1
# Decrease the timeout of one
((timeout--))
done
इसको ऐसे करो
while true
do
[ -f /tmp/list.txt ] && break
sleep 2
done
ls -l /tmp/list.txt