আমি একটি শেল স্ক্রিপ্টে কাজ করছি যা একটি টেক্সট ফাইলের কিছু নির্দিষ্ট পরিবর্তন ঘটে যদি এটি উপস্থিত থাকে তবেই এই পরীক্ষার লুপটি কাজ করে না, আমি ভাবছি কেন? ধন্যবাদ!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
আমি একটি শেল স্ক্রিপ্টে কাজ করছি যা একটি টেক্সট ফাইলের কিছু নির্দিষ্ট পরিবর্তন ঘটে যদি এটি উপস্থিত থাকে তবেই এই পরীক্ষার লুপটি কাজ করে না, আমি ভাবছি কেন? ধন্যবাদ!
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
আপনি এটিও নিশ্চিত করতে পারেন যে আপনি 'ইকো $ শেল' টাইপ করে বাশ (বা সম্পর্কিত) শেলটি ব্যবহার করছেন। আমি মনে করি যে সিএসএইচ এবং টিসিএসএইচ এই লুপটির জন্য কিছুটা আলাদা শব্দার্থক ব্যবহার করে।
while [ ! -f /tmp/list.txt ]; do sleep 2; done; ls -l /tmp/list.txt
আপনি যদি লিনাক্সে থাকেন এবং ইনোটিফাই-সরঞ্জামগুলি ইনস্টল করেন তবে আপনি এটি করতে পারেন:
file=/tmp/list.txt
while [ ! -f "$file" ]
do
inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done
এটি প্রতি "x" সেকেন্ডে ভোট দেওয়ার সময় ঘুমের মাধ্যমে প্রবর্তিত বিলম্ব হ্রাস করে। আপনি যদি মনে করেন যে এগুলি প্রয়োজন হয় তবে আপনি আরও ইভেন্টগুলি যুক্ত করতে পারেন।
--exclude
ফাইলের নামগুলি ফিল্টার করতে হবে, তবে ফাইলের নাম বাদে--include
সবকিছু উপেক্ষা করতে হবে না । উপরের কমান্ডটির পরিবর্তে যুক্তিটি ব্যবহার করা উচিত । -qq
>&/dev/null
--timeout
, চেক করার ফ্রিকোয়েন্সি নয়, না? ইনোটিফাইয়েটের বিষয়টি হ'ল এখানে কোনও পোলিং নেই
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;
আশা করি এটি কাউকে হতাশার আধ ঘন্টা বাঁচাতে সহায়তা করবে!
@ জেন-হুপারের মতো, এনএফএসে আমারও একই সমস্যা হয়েছিল। সমান্তরাল / বিতরণকৃত ফাইল সিস্টেমগুলির মধ্যে আপনার একটি মেশিনে একটি ফাইল তৈরি করার মধ্যে ল্যাগ এবং অন্য মেশিনটি "দেখছে" এটি খুব বড় হতে পারে, সুতরাং লুপটি বের হওয়ার আগে আমি ফাইলটি তৈরি হওয়ার পরে পুরো মিনিট পর্যন্ত অপেক্ষা করতে পারি (এবং ইতিমধ্যে মুছে ফেলা ফাইলটি "দেখছে" এর একটি এফেক্ট রয়েছে।
এটি এমন মায়া তৈরি করে যে স্ক্রিপ্টটি "কাজ করে না" , যখন বাস্তবে এটি ফাইল সিস্টেমটি বলটি বাদ দিচ্ছে।
এটি বের করতে আমার কিছুটা সময় লেগেছে, আশা করি এটি কারও কিছু সময় সাশ্রয় করে।
পিএস এর ফলে "স্টাইল ফাইল হ্যান্ডলার" এর একটি বিরক্তিকর সংখ্যার কারণও রয়েছে।
একটি টাইমআউট সহ একটি সংস্করণ এখানে যাতে সময় পরে লুপ একটি ত্রুটি সঙ্গে শেষ হয়:
# 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