ক্রোন: একটি প্রক্রিয়া চালান তবে কেবল এটি চালানো হয় না?


11

ক্রোনকে কোনও অ্যাপ্লিকেশন চালানোর জন্য বলার উপায় আছে কি তবে যদি কোনও প্রক্রিয়া ইতিমধ্যে বিদ্যমান থাকে তবে এটি চালাবেন না?

linux  cron 

অ্যাপটি ইতিমধ্যে চালু থাকলে চলবে না বা ইতিমধ্যে অন্য কোনও প্রক্রিয়া চলছে কিনা তা আপনি পরিষ্কার করতে পারবেন। ধন্যবাদ
লিঙ্কার 3000

উত্তর:


23

সবচেয়ে সহজ উপায়, pgrep ব্যবহার করুন

ক্রোনটবে:

* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1

এই উত্তরের সরলতা পছন্দ করুন। এফওয়াইআই, আপনার পি-জিআরপি-তে পতাকা যুক্ত করতে সক্ষম হওয়া উচিত এবং আপনি সম্পূর্ণ প্রক্রিয়া নামটি যাচাই করতে পারেন, আপনি যদি নিজের অবস্থার অংশ হিসাবে প্রক্রিয়াটিতে যুক্তিগুলিও পরীক্ষা করতে চান তবে এটি কার্যকর।
ক্রেগ সেফটন

6
না, আপনি ক্রোনজবের ভিতরে pgrep সহ -f পতাকা ব্যবহার করতে পারবেন না। কারণটি হ'ল আপনি নিজেই ক্রোনজব চালানোর জন্য ব্যবহৃত শেল স্ক্রিপ্টের সাথে মিল পাবেন।
CpnCrunch

ক্রোন দিয়ে জিইউআই প্রক্রিয়া চালানোর সময় ত্রুটিগুলি export DISPLAY=:0রোধ করতে প্রিপেন্ড করুন Could not connect to display* * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
বেনজাম

9

সরাসরি প্রোগ্রামের পরিবর্তে স্ক্রিপ্ট চালান। অনেক সম্ভাবনা আছে। উদাহরণ স্বরূপ :

MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
   $RESTART
fi

1
এফওয়াইআই - যুক্তি তালিকাগুলি সংরক্ষণের জন্য স্কেলার ভেরিয়েবলগুলি ব্যবহার করা খারাপ অভ্যাস হিসাবে বিবেচিত হয়। যে ক্ষেত্রে ব্যর্থ হয় তার উদাহরণের জন্য mywiki.wooledge.org/BashFAQ/050 দেখুন ।
চার্লস ডাফি

... একইভাবে, pgrep myprog; if [ $? -ne 0 ]; then ...আরও ভাল হিসাবে লিখিত হবেif ! pgrep myprog; then ...
চার্লস ডাফি

... এই আধুনিক শৈলীটি কেবল আরও পঠনযোগ্য নয়, ত্রুটি-প্রবণতাও কম: $?উদাহরণস্বরূপ লগ বার্তা যুক্ত করে বা লাইনের মধ্যে ত্রুটি পরিচালনা করার মাধ্যমে এটি অনিচ্ছাকৃতভাবে এর মানকে ব্যত্যয় করা সহজ ।
চার্লস ডাফি

7

পূর্ববর্তী উদাহরণটি শেষ না হলে এই স্ক্রিপ্টটি আর চলবে না। যদি আপনি নির্দিষ্ট কিছু প্রক্রিয়া চলমান থাকে তবে কিছু চালাতে চান না, হ্যারিমকের স্ক্রিপ্ট দেখুন।

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

3

আপনি আপনার স্ক্রিপ্টে একটি লক ফাইল ব্যবহার করতে পারেন, তবে দয়া করে প্রক্রিয়া পরিচালনা দেখুন

flock একটি ইউটিলিটি যা ব্যবহার করা যেতে পারে।


ভাল একটা! ম্যানুয়াল হস্তক্ষেপ ছাড়াই ক্লায়েন্ট হোস্টের লাইনে আসা 5 মিনিটের মধ্যে গুলি চালানো, এই ধীর লাইনটি এখন */5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
আরএসসিএনই প্রয়োজন হতে পারে

1

এটি সাধারণত প্রোগ্রাম না হয়ে নিজেই পরিচালনা করে cron। এর জন্য দুটি মানক কৌশল রয়েছে:

1) grepসেই psনামটি দিয়ে ইতিমধ্যে কোনও প্রক্রিয়া চলছে কিনা তা দেখার আউটপুট

২) প্রারম্ভকালে, প্রথমে পিড (প্রসেস আইডি) ফাইলটির অস্তিত্বের জন্য প্রথমে পরীক্ষা করুন /var/run/program_name.pidএবং এটি উপস্থিত থাকলে ফাইলের বাইরে পিডটি পড়ুন এবং প্রক্রিয়াটি এখনও বিদ্যমান কিনা তা যাচাই করুন; যদি এটি হয়, শুরু করতে প্রত্যাখ্যান। যদি পিড ফাইলটি উপস্থিত না থাকে বা ফাইলটির পিড চলে যায় তবে একটি পিড ফাইল তৈরি করুন, এতে আপনার প্রক্রিয়া আইডি লিখুন এবং সাধারণ প্রারম্ভকালে চালিয়ে যান।

প্রযুক্তিগতভাবে বাশ পাইপগুলি লেখার পক্ষে এটি সরাসরি আপনার ক্রোন্টাবের মধ্যে লিখতে পারে, তবে প্রোগ্রামটি শুরু হওয়ার সাথে এগুলি যুক্ত করা ভাল (যাতে তারা এটি কীভাবে শুরু হয় তা প্রয়োগ না করে) অথবা একটি র‌্যাপার স্ক্রিপ্ট লিখতে হবে হ্যারিমিকের পরামর্শ অনুসারে এটি পরিচালনা করুন।


0

* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1

প্যাটার্ন মিলের উন্নতির সাথে আমি উপরের উত্তরটি পুনরায় ব্যবহার করেছি। p বিকল্প ছাড়াই pgrep প্রক্রিয়া বিন্যাসের সাথে মেলে না। তবুও চ অপশনটি ব্যবহার করতে সমস্যা আছে। এফ বিকল্পের সাহায্যে ক্রোন ক্রম করে রাখা শেলটি সর্বদা মিলে যায় এবং তার পিড ফেরত দেয় তাই প্রক্রিয়াটি আর কখনও আরম্ভ হয় না।

একটি বর্ণের প্যাটার্নের প্রায় একটি [] যুক্ত করা কেবলমাত্র প্রক্রিয়াটির সাথে মিলে যায় এবং ক্রোন শেলের পিড ফিরে আসে না।


0

দস্তাবেজ: https://www.timkay.com/solo/

একক একটি খুব সাধারণ স্ক্রিপ্ট (10 লাইন) যা কোনও প্রোগ্রামে একসাথে একাধিক অনুলিপি চালানো থেকে বিরত থাকে। কোনও কাজ পূর্ববর্তী কাজ শেষ হওয়ার আগে চলবে না তা নিশ্চিত করার জন্য ক্রোন দিয়ে এটি দরকারী।

উদাহরণ

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