ল্যাশ পরীক্ষা করার জন্য যখন কোনও ফাইল ব্যাশে উপস্থিত রয়েছে


97

আমি একটি শেল স্ক্রিপ্টে কাজ করছি যা একটি টেক্সট ফাইলের কিছু নির্দিষ্ট পরিবর্তন ঘটে যদি এটি উপস্থিত থাকে তবেই এই পরীক্ষার লুপটি কাজ করে না, আমি ভাবছি কেন? ধন্যবাদ!

while [ ! -f /tmp/list.txt ] ;
do
      sleep 2
done

4
আমি বলতে পারি না যে আমি অবাক; লুপটি কোনও পরিবর্তন করার চেষ্টা করে না।
ইগনাসিও ওয়াজকেজ-আব্রামস

আধা-কোলন অপ্রয়োজনীয়। কীভাবে সেই পরীক্ষার লুপটি কাজ করে না? /Tmp/list.txt ফাইলটি উপস্থিত না হওয়া পর্যন্ত এটি পুনরাবৃত্তভাবে 2 সেকেন্ডের জন্য ঘুমাবে।
জোনাথন লেফলার

4
আমার জন্য কাজ করে - স্ক্রিপ্টের বাইরে ফাইল তৈরি করা হলে লুপটি সমাপ্ত হয়।

4
প্রকৃতপক্ষে, এই লুপটি কেবল ফাইলটি না হওয়া পর্যন্ত অপেক্ষা করতে সহায়তা করে, আমার স্ক্রিপ্টের বাকী পরিবর্তনগুলি ... ... পি
জেনিট

4
এরপরে লুপটি কাজ করে, আমি ঠিক ... দুঃখিত।
জেনিট

উত্তর:


149

আপনি যখন বলেন "কাজ করে না", আপনি কীভাবে জানবেন যে এটি কাজ করে না?

ফাইলটি যুক্ত করে প্রকৃতপক্ষে উপস্থিত রয়েছে কিনা তা আপনি খুঁজে বের করার চেষ্টা করতে পারেন:

while [ ! -f /tmp/list.txt ]
do
  sleep 2 # or less like 0.2
done
ls -l /tmp/list.txt

আপনি এটিও নিশ্চিত করতে পারেন যে আপনি 'ইকো $ শেল' টাইপ করে বাশ (বা সম্পর্কিত) শেলটি ব্যবহার করছেন। আমি মনে করি যে সিএসএইচ এবং টিসিএসএইচ এই লুপটির জন্য কিছুটা আলাদা শব্দার্থক ব্যবহার করে।


আপনি উল্টানো ফাইল চেক কেন ব্যবহার করছেন? পরিবর্তে [-f /tmp/list.txt] ব্যবহার করা উচিত নয়?
ভ্যালেন্ট

4
@ ভ্যালেন্ট ন হিউ লুপটি আক্ষরিকভাবে বলে "ফাইলের উপস্থিতি কখনই ঘুমায় না" .. আপনি 'নট' সরিয়ে
ফেললে লুপটি তত্ক্ষণাত

4
1 লাইনে:while [ ! -f /tmp/list.txt ]; do sleep 2; done; ls -l /tmp/list.txt
ড্রাম এম

55

আপনি যদি লিনাক্সে থাকেন এবং ইনোটিফাই-সরঞ্জামগুলি ইনস্টল করেন তবে আপনি এটি করতে পারেন:

file=/tmp/list.txt
while [ ! -f "$file" ]
do
    inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done

এটি প্রতি "x" সেকেন্ডে ভোট দেওয়ার সময় ঘুমের মাধ্যমে প্রবর্তিত বিলম্ব হ্রাস করে। আপনি যদি মনে করেন যে এগুলি প্রয়োজন হয় তবে আপনি আরও ইভেন্টগুলি যুক্ত করতে পারেন।


4
দক্ষতার জন্য +1। ঘুম সহ পুলিং কুরুচিপূর্ণ। লোকেরা ইনোটিফাইয়েট না জানে - এটি ইনোটিফাই-সরঞ্জামগুলিতে রয়েছে।
মিশা łরাজের

7
এটি একটি অত্যন্ত কার্যকর সরঞ্জাম। লুপ কেন কারও জন্য ভাবছেন, এটি সৃষ্টি এবং অপেক্ষার মধ্যে সম্ভাব্য রেস শর্তগুলির সাথে ডিল করতে হবে এবং কারণ ইনোটিফাইয়েটকে --excludeফাইলের নামগুলি ফিল্টার করতে হবে, তবে ফাইলের নাম বাদে--include সবকিছু উপেক্ষা করতে হবে না । উপরের কমান্ডটির পরিবর্তে যুক্তিটি ব্যবহার করা উচিত । -qq>&/dev/null
ক্রেগ রিঞ্জার

t --timeout, চেক করার ফ্রিকোয়েন্সি নয়, না? ইনোটিফাইয়েটের বিষয়টি হ'ল এখানে কোনও পোলিং নেই
অ্যালেক্স ডিন

4
@ অ্যালেক্সডিয়ান সময়সীমাটি একটি রেসের শর্ত রোধ করা। ঘুমের সাথে পোলিং ধীরে ধীরে কারণ ঘুমের সময় লুপটি বাইরে বেরোবে না, তবে কোনও ইভেন্ট দেখলে ইনোটাইফয়েট টাইমআউটের আগে প্রস্থান করবে।
ইয়েটিং করেছেন

4
@ অ্যালেক্সডিয়ান হ্যাঁ, তবে টেকটিউইউ রেসের শর্তটি রোধ করা দরকার। অন্যথায়, inotifywaitকোনও ফাইল ইভেন্টগুলি শুনতে শুরু করার ঠিক আগে তৈরি করা হলে অনির্দিষ্টকালের জন্য ঝুলতে পারে।
5:59 এ ইংডেড

4

আমারও একই সমস্যা ছিল! বন্ধনী বাইরে;

while ! [ -f /tmp/list.txt ];
do
    echo "#"
    sleep 1
done

এছাড়াও, আপনি যদি লুপটির অভ্যন্তরে একটি প্রতিধ্বনি যুক্ত করেন তবে এটি আপনাকে জানায় যে আপনি লুপে উঠছেন কিনা।


2

আমি একটি অনুরূপ ইস্যুতে দৌড়েছি এবং এটি আমাকে এখানে নিয়ে গেছে তাই আমি যারা সমাধান করতে চাইছি কেবল তার সমাধানের জন্য আমার সমাধানটি ছেড়ে দিতে চাই।

আমি দেখেছি যে আমি দৌড়ালে 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;

আশা করি এটি কাউকে হতাশার আধ ঘন্টা বাঁচাতে সহায়তা করবে!


1

@ জেন-হুপারের মতো, এনএফএসে আমারও একই সমস্যা হয়েছিল। সমান্তরাল / বিতরণকৃত ফাইল সিস্টেমগুলির মধ্যে আপনার একটি মেশিনে একটি ফাইল তৈরি করার মধ্যে ল্যাগ এবং অন্য মেশিনটি "দেখছে" এটি খুব বড় হতে পারে, সুতরাং লুপটি বের হওয়ার আগে আমি ফাইলটি তৈরি হওয়ার পরে পুরো মিনিট পর্যন্ত অপেক্ষা করতে পারি (এবং ইতিমধ্যে মুছে ফেলা ফাইলটি "দেখছে" এর একটি এফেক্ট রয়েছে।

এটি এমন মায়া তৈরি করে যে স্ক্রিপ্টটি "কাজ করে না" , যখন বাস্তবে এটি ফাইল সিস্টেমটি বলটি বাদ দিচ্ছে।

এটি বের করতে আমার কিছুটা সময় লেগেছে, আশা করি এটি কারও কিছু সময় সাশ্রয় করে।

পিএস এর ফলে "স্টাইল ফাইল হ্যান্ডলার" এর একটি বিরক্তিকর সংখ্যার কারণও রয়েছে।


0

বাশ এবং শ উভয় সাথে কাজ করে:

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.."

0

একটি টাইমআউট সহ একটি সংস্করণ এখানে যাতে সময় পরে লুপ একটি ত্রুটি সঙ্গে শেষ হয়:

# 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.