অন্য শেল থেকে শুরু হওয়া কোনও প্রোগ্রামে আমি কীভাবে অপেক্ষা করব


20

আমার একটি প্রোগ্রাম রয়েছে যা প্রচুর পরিমাণে কাজ করে (প্রায় 4-5 ঘন্টা সময় নেয়) যা ক্রোন দ্বারা শুরু হয় যখন এর সাথে কাজ করে সমস্ত ডেটা উপলব্ধ হয়ে যায়। কখনও কখনও, যখন আমি এটি শেষ হওয়ার অপেক্ষায় থাকি, আমি শেষ করতেই অন্য একটি (ইন্টারেক্টিভ) প্রোগ্রাম শুরু করতে সক্ষম হতে চাই। ওয়েট কলটি আশাব্যঞ্জক মনে হলেও কেবল বাচ্চাদের জন্য অপেক্ষা করবে।


কেবলমাত্র অন্য পদ্ধতিটিই আমি ধারণা করতে পারি তা হল ক্রোনজব থেকে একটি ফাইল তৈরি করা, এবং তারপরে সেই প্রক্রিয়াটিতে ইনোটিফয়েট ব্যবহার করা, যখন ফাইলগুলি মুছে ফেলা হয়, তখন আপনার ২ য় প্রক্রিয়া (ইনোটিফয়েট চলছে) শুরু হতে পারে।
slm

আমি মনে করি আপনি ipcআন্তঃসম্পূর্ণ যোগাযোগ ব্যবহার করে এই লাইনগুলি বরাবর কিছু করতে পারেন । man ipc
slm

যদিও আপনি একটি পরিষেবা পর্যবেক্ষক নেই এটি পুনরায় আরম্ভ করা, ঈশ্বর, Monit, বা অন্যান্য pkgs এই Q & A- উল্লেখ খুব কাজ হবে এক: unix.stackexchange.com/questions/75785/...
SLM

@slm কোনও ফাইল সিস্টেমে inotify ব্যবহার করা যেতে পারে উদাহরণস্বরূপ / proc / _pid_ / fd / 1 এ ক্লোজ_উইট এ অপেক্ষা করুন?
hildred

সম্পূর্ণরূপে নিশ্চিত নয়, তবে এটি এটি করার অন্য একটি উপায় হতে পারে 8-)। কিছু কিউ ছিল যা আমি মনে করি যেখানে ইনোটিফয়েট (ফাইলগুলির জন্য) এর মতো প্রক্রিয়া পর্যবেক্ষণ সম্পর্কিত কিছু নতুন কার্নেল কার্যকারিতা ছিল। এই নতুন বৈশিষ্ট্যটি প্রক্রিয়াধীন ইভেন্টগুলির জন্য ছিল, আমি ভেবেছিলাম তবে প্রশ্নোত্তরগুলির অনেকগুলি আমার মনে 8-) একসাথে চলতে শুরু করে। আমি মনে করি এটি আমার বা গিলস সরবরাহ করেছিলেন।
slm

উত্তর:


13

আমি অবশ্যই সম্পাদনা # 3 সমাধানটি পছন্দ করি (নমুনা দেখুন)।

যদি এটি একই শেলের মধ্যে না থাকে তবে পিএস-পি- তে সত্য হিসাবে ফিরে আসার সাথে কিছুক্ষণ লুপ ব্যবহার করুন । প্রসেসরের ব্যবহার হ্রাস করতে লুপটিতে একটি ঘুম দিন

while ps -p <pid> >/dev/null 2>&1
do
   sleep 10
done 

বা যদি আপনার ইউএনআইএক্স সমর্থন করে / প্রোকে (উদাহরণস্বরূপ এইচপি-ইউএক্স এখনও দেয় না)।

while [[ -d /proc/<pid> ]]
do 
    sleep 10
done

আপনি যদি একটি সময়সীমা চান

timeout=6  # timeout after 1mn  
while ((timeout > 0)) && ps -p <pid> >/dev/null 2>&1
do
   sleep 10
   ((timeout -= 1))
done 

সম্পাদনা # 1

অন্য একটি উপায় আছে: ক্রোন ব্যবহার করবেন না । আপনার কাজ স্তুপ করতে ব্যাচ কমান্ড ব্যবহার করুন ।

উদাহরণস্বরূপ আপনি প্রতিদিন আপনার সমস্ত কাজ স্ট্যাক করতে পারেন। কিছু সমান্তরালতার জন্য ব্যাচকে টিউন করা যেতে পারে যাতে একটি ব্লক করা কাজটি সমস্ত স্ট্যাক বন্ধ করে দেয় না (এটি অপারেটিং সিস্টেমের উপর নির্ভর করে)।

সম্পাদনা # 2

আপনার হোম ডিরেক্টরিতে একটি ফিফো তৈরি করুন:

$ mkfifo ~/tata

আপনার কাজ শেষে:

echo "it's done" > ~/tata

অন্য কাজ শুরুর সময় (যিনি অপেক্ষা করছেন):

cat ~/tata 

এটি পোলিং করছে না এটি পুরানো ভাল ব্লকিং আইও is

সম্পাদনা # 3

সংকেত ব্যবহার:

স্ক্রিপ্টের শুরুতে (গুলি) যারা অপেক্ষা করছে:

echo $$ >>~/WeAreStopped
kill -STOP $$

আপনার দীর্ঘ কাজ শেষে:

if [[ -f ~/WeAreStopped ]] ; then
    xargs kill -CONT < ~/WeAreStopped
    rm ~/WeAreStopped
fi

পোলিং, ইয়াক! মনোরম সিদ্ধান্ত: নষ্ট প্রসেসরের সময় বা ঘুমের সুরের জন্য আমার সময়। এর চেয়ে আরও ভাল উত্তর থাকতে হবে।
hildred

:) পোলিং আপনার পক্ষে ভাল, পোলিং রাষ্ট্রহীন, ভোটদান নির্ভরযোগ্য।
এমমানুয়েল

ভোটদান ধীর, পোষা অপচয়কারী প্রসেসরের সময়।
hildred

০.০১ এর কার্যকর সময় সহ 4 ঘন্টার মধ্যে সম্পাদিত 1440 পিএস 14.4 সেবন করত। কাজের নির্ভরতা পরিচালনা করার সময়সূচীর চেয়ে অনেক কম: ডি
এমমানুয়েল

আমি মনে করি এটা সম্ভবত সবচেয়ে ভাল বিকল্প হল: stackoverflow.com/questions/1058047/... , যদিও এটা হল hacky আছে।
slm

5

কিছু পতাকা ব্যবহার করতে আপনি আপনার ক্রোন জবটি পরিবর্তন করতে পারেন।

পরিবর্তে

2  2 * * *           /path/my_binary

তুমি ব্যবহার করতে পার

2  2 * * *           touch /tmp/i_m_running; /path/my_binary; rm /tmp/i_m_running

এবং এই স্ক্রিপ্ট বা এমনকি ম্যানুয়ালি এই ফাইল নিরীক্ষণ। যদি এটি বিদ্যমান থাকে, তবে আপনার প্রোগ্রামটি চলছে; অন্যথায় আপনি যা খুশি তা করতে নির্দ্বিধায়

স্ক্রিপ্ট নমুনা:

while [[ -f /tmp/i_m_running ]] ; do
   sleep 10 ;
done
launch_whatever_you_want

আপনি যদি ব্যবহার করতে পছন্দ না করেন তবে sleepআপনি স্ক্রিপ্টটি পরিবর্তন করতে পারেন এবং প্রতি X মিনিটে একবার ক্রোন এর মাধ্যমে চালাতে পারেন।

সেক্ষেত্রে স্ক্রিপ্ট নমুনা হবে:

[[ -f /tmp/i_m_running ]] && { echo "Too early" ; exit ; }
launch_whatever_you_want

এই উপায়টি খানিকটা সহজ, কারণ আপনার ক্রোন প্রক্রিয়াটির পিআইডি খুঁজে বের করতে হবে না।


4

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

do_large_amount_of_work
start_interactive_program

আপনি যদি এটি না করতে পারেন, উদাহরণস্বরূপ আপনি ক্রোন জব থেকে প্রচুর পরিমাণে কাজ শুরু করতে চান তবে আপনার সেশনের প্রেক্ষাপট থেকে ইন্টারেক্টিভ প্রোগ্রাম, তবে এটি তৈরি করুন

do_large_amount_of_work
notify_completion

বাস্তবায়নের বিভিন্ন উপায় রয়েছে notify_completion। কিছু ডেস্কটপ পরিবেশ একটি বিজ্ঞপ্তি প্রক্রিয়া সরবরাহ করে ( একটি রিমোট এক্স ডিসপ্লেতে একটি উইন্ডো খুলুন (কেন "প্রদর্শন খুলতে পারে না" কার্যকর হতে পারে))। আপনি ফাইল পরিবর্তন বিজ্ঞপ্তি ব্যবহার করে একটি করতে পারেন। লিনাক্সে, ফাইল পরিবর্তন নোটিফিকেশন সুবিধাটি অজানা

do_large_amount_of_work
echo $? >/path/to/finished.stamp

সৃষ্টিতে প্রতিক্রিয়া জানাতে /path/to/finished.stamp:

inotifywait -e close_write -q /path/to/finished.stamp
start_interactive_program

আপনি যদি do_large_amount_of_workউপায়টি পরিবর্তন করতে না পারেন তবে আহ্বান জানানো হয়েছে তবে শেষ মুহুর্তে এটি কোন ফাইলটি পরিবর্তিত হয় আপনি সেই ফাইলটি বন্ধ হয়ে যাওয়ার পরে প্রতিক্রিয়া দেখাতে একই পদ্ধতি ব্যবহার করতে পারেন। আপনি ফাইলের নামকরণের মতো অন্যান্য ইভেন্টগুলিতেও প্রতিক্রিয়া জানাতে পারেন ( inotifywaitসম্ভাবনার তালিকার জন্য ম্যানুয়াল দেখুন )।


0

ক্রোনজব দ্বারা স্ক্রিপ্টটি ট্রিগার করাতে একটি খালি শেল স্ক্রিপ্টের অনুরোধ করুন যাতে আপনার প্রয়োজন হলে ফলো-আপ কার্য সন্নিবেশ করতে পারেন।

এটি গিলসের পদ্ধতির সাথে খুব মিল।

cronjob-task.sh রয়েছে:

# do_large_amount_of_work

./post-execute.sh

post-execute.shসাধারণত খালি যেখানে আপনি যদি না দেখে থাকেন যে আপনাকে কোনও ফলো-আপ কার্যটি ট্রিগার করতে হবে।

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