পিআইডি-ফাইল, ক্রোন বা অন্য কোনও কিছু এড়িয়ে চলুন যা তাদের বাচ্চাদের নয় এমন প্রক্রিয়াগুলি মূল্যায়নের চেষ্টা করে।
ইউনিক্সে থাকার একটি খুব ভাল কারণ রয়েছে, আপনি কেবলমাত্র আপনার বাচ্চাদের জন্য অপেক্ষা করতে পারেন। যে কোনও পদ্ধতি (পিএস পার্সিং, পিগ্রেপ, একটি পিআইডি সঞ্চয় করে রাখা, ...) যা এর চারপাশে কাজ করার চেষ্টা করে ত্রুটিযুক্ত এবং এতে ফাঁক গর্ত রয়েছে। শুধু কোন ।
পরিবর্তে আপনার প্রক্রিয়াটির প্যারেন্ট হওয়ার জন্য আপনার প্রক্রিয়া পর্যবেক্ষণ করে এমন প্রক্রিয়াটি প্রয়োজন। এটার মানে কি? এর অর্থ শুধুমাত্র আপনার প্রক্রিয়া শুরু হওয়া প্রক্রিয়াটি নির্ভরযোগ্যতার সাথে এটি শেষ হওয়ার জন্য অপেক্ষা করতে পারে। বাশ এ, এটি একেবারে তুচ্ছ।
until myserver; do
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
done
উপরের অংশে বাশ কোডটি myserverএকটি untilলুপে চলে lo প্রথম লাইনটি শুরু হয় myserverএবং এটি শেষ হওয়ার জন্য অপেক্ষা করে। এটি শেষ হয়ে গেলে untilএর প্রস্থান স্থিতি পরীক্ষা করে। যদি প্রস্থান স্থিতি হয় 0তবে এর অর্থ এটি নিখুঁতভাবে শেষ হয়েছে (যার অর্থ আপনি এটি কোনওভাবে বন্ধ করতে বলেছেন, এবং এটি এত সফলভাবে করেছে)। সেক্ষেত্রে আমরা এটিকে পুনরায় চালু করতে চাই না (আমরা কেবল এটি বন্ধ করতে বলেছি!)। প্রস্থান অবস্থা হয়, তাহলে না 0 , untilলুপ শরীর, যা stderr উপর একটি ত্রুটির বার্তা নির্গত এবং লুপ (লাইন 1 ফিরে) রিস্টার্ট চালানো হবে 1 সেকেন্ড পর ।
আমরা কেন এক সেকেন্ড অপেক্ষা করব? কারণ যদি কোনও প্রারম্ভিক ক্রমটির সাথে কিছু ভুল হয়ে যায় myserverএবং তা অবিলম্বে ক্র্যাশ হয়ে যায়, আপনার হাতে ধ্রুবক পুনরায় চালু এবং ক্রাশ হওয়ার খুব নিবিড় লুপ থাকবে। sleep 1যে থেকে স্ট্রেন দূরে লাগে।
এখন আপনাকে যা করতে হবে তা হ'ল এই বাশ স্ক্রিপ্টটি শুরু করা (অবিচ্ছিন্নভাবে সম্ভবত, সম্ভবত), এবং এটি এটি পর্যবেক্ষণ করে myserverএবং প্রয়োজনীয় হিসাবে এটি পুনরায় আরম্ভ করবে। আপনি যদি বুটে মনিটরটি চালু করতে চান (সার্ভারটিকে "বেঁচে থাকা" রিবুটগুলি তৈরি করে), আপনি একটি @rebootনিয়ম সহ এটি আপনার ব্যবহারকারীর ক্রোন (1) এ শিডিউল করতে পারেন । এতে আপনার ক্রোন বিধিগুলি খুলুন crontab:
crontab -e
তারপরে আপনার মনিটরের স্ক্রিপ্ট শুরু করতে একটি বিধি যুক্ত করুন:
@reboot /usr/local/bin/myservermonitor
বিকল্পভাবে; inittab (5) এবং / ইত্যাদি / inittab দেখুন। myserverনির্দিষ্ট প্রাথমিক স্তরে শুরু করতে আপনি স্বয়ংক্রিয়ভাবে পুনঃস্থাপন করতে সেখানে একটি লাইন যুক্ত করতে পারেন ।
সম্পাদনা করুন।
পিআইডি ফাইলগুলি কেন ব্যবহার করবেন না সে সম্পর্কে আমাকে কিছু তথ্য যুক্ত করুন । যদিও তারা খুব জনপ্রিয়; এগুলিও খুব ত্রুটিযুক্ত এবং কোনও কারণ নেই যে আপনি কেবল এটি সঠিক উপায়ে করবেন না।
এই বিবেচনা:
পিআইডি পুনর্ব্যবহারযোগ্য (ভুল প্রক্রিয়াটি হত্যা করা):
/etc/init.d/foo start: শুরু করুন foo, fooএর পিআইডি লিখুন/var/run/foo.pid
- কিছুক্ষণ পরে:
fooএকরকম মারা যায়।
- কিছুক্ষণ পরে: যে কোনও র্যান্ডম প্রক্রিয়া শুরু হয় (এটি কল করুন
bar) একটি এলোমেলো পিআইডি নেয়, এটি fooপুরানো পিআইডি গ্রহণ করার কথা কল্পনা করুন ।
- আপনি লক্ষ্য
fooকরেছেন যে: /etc/init.d/foo/restartপড়েছে /var/run/foo.pid, এটি এখনও জীবিত আছে কিনা তা পরীক্ষা করে দেখুন, এটি আবিষ্কার করেছেন bar, মনে করেন foo, হত্যা করে, একটি নতুন শুরু করে foo।
পিআইডি ফাইলগুলি বাসি হয়ে যায়। আপনার পিআইডি ফাইলটি বাসি কিনা তা পরীক্ষা করার জন্য আপনার অতিরিক্ত জটিল (বা আমি বলতে চাই, তুচ্ছ-তাত্পর্যপূর্ণ) যুক্তি প্রয়োজন, এবং এই জাতীয় কোনও যুক্তি আবারও ঝুঁকির মধ্যে রয়েছে 1.।
আপনি যদি লেখার অ্যাক্সেস না পেয়ে থাকেন বা কেবল পঠন-পরিবেশে থাকেন তবে কি হবে?
এটি অর্থহীন অতিরিক্ত জটিলতা; উপরের আমার উদাহরণটি কত সহজ। একেবারেই জটিল করার দরকার নেই।
আরও দেখুন: পিআইডি-ফাইলগুলি 'ডান' করার সময় কি ত্রুটিযুক্ত?
যাইহোক; এর চেয়েও খারাপ পিআইডি ফাইলগুলি পার্সিং করছে ps! কখনও এই কাজ করবেন না।
psখুব unportable। আপনি এটি প্রায় প্রতিটি ইউএনআইএক্স সিস্টেমে খুঁজে পেয়েছেন; যদি আপনি অ-মানক আউটপুট চান তবে এর আর্গুমেন্টগুলি ব্যাপকভাবে পরিবর্তিত হয়। এবং স্ট্যান্ডার্ড আউটপুট কেবলমাত্র মানুষের ব্যবহারের জন্য, স্ক্রিপ্টযুক্ত পার্সিংয়ের জন্য নয়!
- পার্সিং অনেকগুলি
psমিথ্যা ধনাত্মক দিকে নিয়ে যায়। ps aux | grep PIDউদাহরণটি ধরুন , এবং এখন কল্পনা করুন যে কোনও ব্যক্তি কোথাও একটি সংখ্যা দিয়ে যুক্তি হিসাবে একটি প্রক্রিয়া শুরু করছেন যা আপনি আপনার ডিমনকে পিআইডি দিয়ে তাকাতে সমান হয়েছিলেন! দু'জন লোক এক্স সেশন শুরু করার কথা ভাবুন এবং আপনি এক্সকে মেরে ফেলার চেষ্টা করছেন। এটা সব ধরণের খারাপ।
আপনি যদি প্রক্রিয়াটি নিজে পরিচালনা করতে না চান; কিছু পুরোপুরি ভাল সিস্টেম আছে যা আপনার প্রক্রিয়াগুলির জন্য মনিটর হিসাবে কাজ করবে। উদাহরণস্বরূপ রুনিটের দিকে নজর দিন ।