ক্রোনকে কোনও অ্যাপ্লিকেশন চালানোর জন্য বলার উপায় আছে কি তবে যদি কোনও প্রক্রিয়া ইতিমধ্যে বিদ্যমান থাকে তবে এটি চালাবেন না?
ক্রোনকে কোনও অ্যাপ্লিকেশন চালানোর জন্য বলার উপায় আছে কি তবে যদি কোনও প্রক্রিয়া ইতিমধ্যে বিদ্যমান থাকে তবে এটি চালাবেন না?
উত্তর:
সবচেয়ে সহজ উপায়, pgrep ব্যবহার করুন
ক্রোনটবে:
* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
export DISPLAY=:0
রোধ করতে প্রিপেন্ড করুন Could not connect to display
। * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
সরাসরি প্রোগ্রামের পরিবর্তে স্ক্রিপ্ট চালান। অনেক সম্ভাবনা আছে। উদাহরণ স্বরূপ :
MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
$RESTART
fi
pgrep myprog; if [ $? -ne 0 ]; then ...
আরও ভাল হিসাবে লিখিত হবেif ! pgrep myprog; then ...
$?
উদাহরণস্বরূপ লগ বার্তা যুক্ত করে বা লাইনের মধ্যে ত্রুটি পরিচালনা করার মাধ্যমে এটি অনিচ্ছাকৃতভাবে এর মানকে ব্যত্যয় করা সহজ ।
পূর্ববর্তী উদাহরণটি শেষ না হলে এই স্ক্রিপ্টটি আর চলবে না। যদি আপনি নির্দিষ্ট কিছু প্রক্রিয়া চলমান থাকে তবে কিছু চালাতে চান না, হ্যারিমকের স্ক্রিপ্ট দেখুন।
DATE=`date +%c`;
ME=`basename "$0"`;
LCK="./${ME}.LCK";
exec 8>$LCK;
if flock -n -x 8; then
echo ""
echo "Starting your script..."
echo ""
[PUT YOUR STUFF HERE]
echo ""
echo "Script started $DATE";
echo "Script finished `date +%c`";
else
echo "Script NOT started - previous one still running at $DATE";
fi
আপনি আপনার স্ক্রিপ্টে একটি লক ফাইল ব্যবহার করতে পারেন, তবে দয়া করে প্রক্রিয়া পরিচালনা দেখুন ।
flock
একটি ইউটিলিটি যা ব্যবহার করা যেতে পারে।
*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
এটি সাধারণত প্রোগ্রাম না হয়ে নিজেই পরিচালনা করে cron
। এর জন্য দুটি মানক কৌশল রয়েছে:
1) grep
সেই ps
নামটি দিয়ে ইতিমধ্যে কোনও প্রক্রিয়া চলছে কিনা তা দেখার আউটপুট
২) প্রারম্ভকালে, প্রথমে পিড (প্রসেস আইডি) ফাইলটির অস্তিত্বের জন্য প্রথমে পরীক্ষা করুন /var/run/program_name.pid
এবং এটি উপস্থিত থাকলে ফাইলের বাইরে পিডটি পড়ুন এবং প্রক্রিয়াটি এখনও বিদ্যমান কিনা তা যাচাই করুন; যদি এটি হয়, শুরু করতে প্রত্যাখ্যান। যদি পিড ফাইলটি উপস্থিত না থাকে বা ফাইলটির পিড চলে যায় তবে একটি পিড ফাইল তৈরি করুন, এতে আপনার প্রক্রিয়া আইডি লিখুন এবং সাধারণ প্রারম্ভকালে চালিয়ে যান।
প্রযুক্তিগতভাবে বাশ পাইপগুলি লেখার পক্ষে এটি সরাসরি আপনার ক্রোন্টাবের মধ্যে লিখতে পারে, তবে প্রোগ্রামটি শুরু হওয়ার সাথে এগুলি যুক্ত করা ভাল (যাতে তারা এটি কীভাবে শুরু হয় তা প্রয়োগ না করে) অথবা একটি র্যাপার স্ক্রিপ্ট লিখতে হবে হ্যারিমিকের পরামর্শ অনুসারে এটি পরিচালনা করুন।
* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1
প্যাটার্ন মিলের উন্নতির সাথে আমি উপরের উত্তরটি পুনরায় ব্যবহার করেছি। p বিকল্প ছাড়াই pgrep প্রক্রিয়া বিন্যাসের সাথে মেলে না। তবুও চ অপশনটি ব্যবহার করতে সমস্যা আছে। এফ বিকল্পের সাহায্যে ক্রোন ক্রম করে রাখা শেলটি সর্বদা মিলে যায় এবং তার পিড ফেরত দেয় তাই প্রক্রিয়াটি আর কখনও আরম্ভ হয় না।
একটি বর্ণের প্যাটার্নের প্রায় একটি [] যুক্ত করা কেবলমাত্র প্রক্রিয়াটির সাথে মিলে যায় এবং ক্রোন শেলের পিড ফিরে আসে না।
দস্তাবেজ: https://www.timkay.com/solo/
একক একটি খুব সাধারণ স্ক্রিপ্ট (10 লাইন) যা কোনও প্রোগ্রামে একসাথে একাধিক অনুলিপি চালানো থেকে বিরত থাকে। কোনও কাজ পূর্ববর্তী কাজ শেষ হওয়ার আগে চলবে না তা নিশ্চিত করার জন্য ক্রোন দিয়ে এটি দরকারী।
উদাহরণ
* * * * * solo -port=3801 ./job.pl blah blah