আমার ক্রন্টব কেন কাজ করছে না এবং আমি কীভাবে এটির সমস্যা সমাধান করব?


225

ক্রোন ও ক্রন্টব ব্যবহার সম্পর্কে এটি একটি ক্যানোনিকাল প্রশ্ন

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

' আমার ক্রন্টব কেন কাজ করছে না এর উত্তর , এবং আমি কীভাবে এটির সমস্যা সমাধান করব? 'নীচে দেখা যাবে। এটি cronক্রোনটব হাইলাইট করে সিস্টেমকে সম্বোধন করে ।


2
এটি আসকউবুন্টুতে ক্রন্টব কেন কাজ করে না তার কারণগুলির একটি বিশাল ধাপ।
ড্যান ড্যাসকলেসকু

1
@ ড্যানডাসকলেসকু মনে হচ্ছে এরিকের আরও বেশি প্রতিনিধি হওয়া দরকার
আমি

1
আমি কেবল সার্ভার ফল্ট এসই তে যোগদান করেছি (সুতরাং কেবল 101 টি প্রতিনিধি), তবে এই প্রশ্নটিকে একটি -1 দিতে ভাল লাগবে !! এই প্রশ্নটি কি কেবল রেপ পেতে হয়েছিল? @ আইমথ মস্টস্টুপিড পার্সন সম্পূর্ণরূপে আপনার সাথে একমত ...
হলিপোগ্রামার

এই ১৩ বছরের পুরনো পাডাওয়ানের পশ্চিমা আদর্শ হ'ল পাঠ্যপুস্তক এবং অন্ধত্ব উভয়ই সুপারনোভা। আপনার উভয় প্রশ্নের উত্তর দেওয়ার জন্য: হ্যাঁ, আমি এটি প্রতিনিধিটির জন্য করেছি এবং হ্যাঁ, এরিকের আরও খ্যাতি পাওয়া দরকার। আমার আর কত প্রতিনিধি দরকার ?? আরো। youtu.be/IaDt9T7BF38?t=262
এরিক লেসচিনস্কি

উত্তর:


316

আপনার ক্রন্টব সম্পর্কিত সমস্ত হতাশা / সমস্যাগুলি কীভাবে সমাধান করবেন (লিনাক্স)


এটি একটি সম্প্রদায় উইকি , যদি আপনি এই উত্তরের সাথে কোনও ভুল দেখেন বা অতিরিক্ত তথ্য থাকে তবে দয়া করে এটি সম্পাদনা করুন।


প্রথম, মৌলিক পরিভাষা:

  • ক্রোন (8) ডেমন যা নির্ধারিত কমান্ডগুলি কার্যকর করে।
  • ক্রন্টব (1) হ'ল প্রোগ্রামটি ব্যবহারকারী ক্রন্টব (5) ফাইল সংশোধন করতে ব্যবহৃত হয়।
  • ক্রন্টব (5) একটি ব্যবহারকারী ফাইল যা ক্রোন (8) এর জন্য নির্দেশাবলী ধারণ করে।

পরবর্তী, ক্রোন সম্পর্কে শিক্ষা:

সিস্টেমের প্রতিটি ব্যবহারকারীর নিজস্ব ক্রন্টব ফাইল থাকতে পারে। রুট এবং ব্যবহারকারী ক্রন্টব ফাইলগুলির অবস্থান সিস্টেম নির্ভর কিন্তু সেগুলি সাধারণত নীচে থাকে /var/spool/cron

একটি সিস্টেম-ওয়াইড /etc/crontabফাইল রয়েছে, /etc/cron.dডিরেক্টরিটিতে ক্রন্টব টুকরা থাকতে পারে যা ক্রোন দ্বারা পড়া এবং ক্রিয়াও করা হয়। কিছু লিনাক্স ডিস্ট্রিবিউশন (যেমন, রেড হ্যাট) -এর মধ্যে /etc/cron.{hourly,daily,weekly,monthly}রয়েছে ডিরেক্টরি, স্ক্রিপ্ট যা প্রতিটি ঘন্টা / দিন / সপ্তাহ / মাসে কার্যকর করা হবে, মূল সুযোগ সহ।

রুট সর্বদা crontab কমান্ড ব্যবহার করতে পারে; নিয়মিত ব্যবহারকারীদের অ্যাক্সেস দেওয়া হতে পারে বা নাও হতে পারে। আপনি যখন কমান্ডের সাহায্যে crontab -eক্রন্টব ফাইলটি সম্পাদনা করেন এবং সংরক্ষণ করেন, ক্রন্ড এটি মৌলিক বৈধতার জন্য যাচাই করে তবে আপনার ক্রন্টব ফাইলটি সঠিকভাবে গঠনের গ্যারান্টি দেয় না। এমন একটি ফাইল বলা হয়েছে cron.denyযা ব্যবহারকারীরা ক্রোন ব্যবহার করতে পারবেন না তা নির্দিষ্ট করবে। cron.denyফাইল অবস্থান সিস্টেম নির্ভরশীল এবং মোছা যাবে, যা সমস্ত ব্যবহারকারী ক্রন ব্যবহার করতে অনুমতি দেবে।

কম্পিউটারটি চালিত না থাকলে বা ক্রন্ড ডেমন চলমান না থাকলে এবং কমান্ড চালানোর তারিখ / সময় পার হয়ে গেলে, ক্রন্ড ক্যাপআপ গ্রহণ করবে না এবং অতীত অনুসন্ধানগুলি চালাবে না।

ক্রোনটব বিশদ, কীভাবে একটি কমান্ড তৈরি করা যায়:

একটি ক্রন্টব কমান্ড একটি একক লাইন দ্বারা প্রতিনিধিত্ব করা হয়। আপনি \একাধিক লাইনে একটি কমান্ড প্রসারিত করতে ব্যবহার করতে পারবেন না । হ্যাশ ( #) চিহ্নটি এমন একটি মন্তব্য উপস্থাপন করে যার অর্থ লাইনটিতে থাকা কোনও কিছুই ক্রোন দ্বারা উপেক্ষা করা হয়। শীর্ষস্থানীয় সাদা স্থান এবং ফাঁকা লাইন উপেক্ষা করা হয়।

%আপনার কমান্ডে শতাংশ ( ) সাইন ব্যবহার করার সময় খুব সাবধানতা অবলম্বন করুন । যদি তারা না পালায় \%তবে এগুলি নতুন লাইনে রূপান্তরিত হয় এবং প্রথম অ-পালনের পরে সমস্ত কিছু %আপনার স্ট্যান্ডিনের আদেশে সরিয়ে দেওয়া হয়।

ক্রন্টব ফাইলগুলির জন্য দুটি ফর্ম্যাট রয়েছে:

  • ব্যবহারকারী crontabs

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  *   command to be executed
    
  • সিস্টেম প্রশস্ত /etc/crontabএবং /etc/cron.dটুকরা

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed
    

লক্ষ্য করুন যে পরবর্তীটির জন্য ব্যবহারকারীর নাম প্রয়োজন। কমান্ডটি নামযুক্ত ব্যবহারকারী হিসাবে চালিত হবে।

লাইনের প্রথম 5 ক্ষেত্র কমান্ডটি চালিত হওয়ার সময় (গুলি) উপস্থাপন করে। আপনি সময় নির্দিষ্টকরণে নম্বর বা যেখানে প্রযোজ্য দিন / মাসের নাম ব্যবহার করতে পারেন।

  • ক্ষেত্রগুলি স্পেস বা ট্যাব দ্বারা পৃথক করা হয়।
  • একটি কমা ( ,) একটি তালিকা নির্দিষ্ট করতে ব্যবহৃত হয় যেমন 1,4,6,8 যার অর্থ 1,4,6,8 এ চালানো হয় run
  • ব্যাপ্তিগুলি একটি ড্যাশ ( -) দিয়ে সুনির্দিষ্ট করা হয় এবং তালিকাগুলির সাথে মিলিত হতে পারে উদাহরণস্বরূপ ১-৩,৯-১২ যার অর্থ 1 এবং 3 এর মধ্যে 9 এবং 12 এর মধ্যে থাকে।
  • /চরিত্র একটি পদক্ষেপ যেমন 2/5 যা 2 থেকে শুরু মানে তারপর প্রতি 5 পরিচয় করিয়ে দিতে (2,7,12,17,22 ...) ব্যবহার করা যাবে। এগুলি শেষের দিকে যায় না।
  • *একটি ক্ষেত্রের একটি তারকাচিহ্ন (ter ) ক্ষেত্রের জন্য পুরো ব্যাপ্তিটি বোঝায় (উদাহরণস্বরূপ 0-59মিনিটের ক্ষেত্রের জন্য)।
  • ব্যাপ্তি এবং পদক্ষেপগুলি একত্রিত হতে পারে উদাহরণস্বরূপ */2প্রাসঙ্গিক ক্ষেত্রে সর্বনিম্ন থেকে শুরু করে প্রতি 2 উদাহরণস্বরূপ 0 মিনিটের জন্য (0,2 ... 58), 1 মাসের জন্য (1,3 ... 11) ইত্যাদি sign

ডিবাগিং ক্রোন কমান্ড

মেল চেক করুন!

ডিফল্টরূপে ক্রোন কমান্ড থেকে যে কোনও আউটপুট ব্যবহারকারীকে মেল করবে এটি কমান্ডটি চালাচ্ছে। যদি আউটপুট না থাকে তবে কোনও মেল থাকবে না। যদি আপনি ক্রোন অন্য কোনও অ্যাকাউন্টে মেল প্রেরণ করতে চান তবে আপনি ক্রন্টব ফাইলটিতে মাইল্টোর পরিবেশ পরিবর্তনশীল সেট করতে পারেন যেমন

MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command

আউটপুট নিজেই ক্যাপচার করুন

আপনি stdout এবং stderr একটি ফাইলে পুনর্নির্দেশ করতে পারেন। আউটপুট ক্যাপচারের জন্য সঠিক সিনট্যাক্সটি কী শেল ক্রোন ব্যবহার করছে তার উপর নির্ভর করে ভিন্ন হতে পারে। এখানে দুটি উদাহরণ রয়েছে যা কোনও ফাইলে সমস্ত আউটপুট সংরক্ষণ করে /tmp/mycommand.log:

1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1

লগগুলি দেখুন

ক্রোন সিসলগের মাধ্যমে তার ক্রিয়াকলাপগুলি লগ করে, যা (আপনার সেটআপের উপর নির্ভর করে) প্রায়শই যায় /var/log/cronবা যায় /var/log/syslog

প্রয়োজনে আপনি যেমন ক্রোন স্টেটমেন্টগুলি ফিল্টার করতে পারেন

grep CRON /var/log/syslog 

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

ক্রোন চলছে কিনা তা পরীক্ষা করুন

যদি ক্রোন চলমান না থাকে তবে আপনার আদেশগুলি নির্ধারিত হবে না ...

ps -ef | grep cron | grep -v grep

তোমার মতো কিছু পাওয়া উচিত

root    1224   1  0 Nov16 ?    00:00:03 cron

অথবা

root    2018   1  0 Nov14 ?    00:00:06 crond

এটি পুনরায় চালু না হলে

/sbin/service cron start

অথবা

/sbin/service crond start

অন্যান্য পদ্ধতি থাকতে পারে; আপনার ডিস্ট্রো যা সরবরাহ করে তা ব্যবহার করুন।

ক্রোন একটি সীমাবদ্ধ পরিবেশে আপনার কমান্ড চালায়।

পরিবেশের ভেরিয়েবলগুলি কী উপলভ্য তা সম্ভবত খুব সীমাবদ্ধ। সাধারণত, আপনি শুধুমাত্র যেমন হিসাবে সংজ্ঞায়িত কয়েক ভেরিয়েবল, পাবেন $LOGNAME, $HOMEএবং $PATH

নির্দিষ্ট নোট PATHসীমাবদ্ধ হয় /bin:/usr/bin"আমার ক্রোন লিপিটি বিপুল পরিমাণে কাজ করে না" সমস্যাগুলি এই সীমাবদ্ধ পথের কারণে ঘটে । যদি আপনার কমান্ড অন্য কোনও স্থানে থাকে তবে আপনি এটি কয়েকটি উপায়ে সমাধান করতে পারেন:

  1. আপনার কমান্ডের পুরো পথ সরবরাহ করুন।

    1 2 * * * /path/to/your/command
    
  2. ক্রন্টব ফাইলটিতে উপযুক্ত PATH সরবরাহ করুন

    PATH=/usr:/usr/bin:/path/to/something/else
    1 2 * * * command 
    

যদি আপনার কমান্ডের জন্য অন্যান্য পরিবেশের ভেরিয়েবলের প্রয়োজন হয় তবে আপনি এগুলি ক্রন্টব ফাইলটিতেও সংজ্ঞায়িত করতে পারেন।

ক্রোন cwd == w হোম দিয়ে আপনার কমান্ড চালায়

আপনি যে প্রোগ্রামটি কার্যকর করেন তা ফাইল সিস্টেমের যেখানেই থাকুক না কেন, ক্রোন চলাকালীন প্রোগ্রামটির বর্তমান ওয়ার্কিং ডিরেক্টরি এটি ব্যবহারকারীর হোম ডিরেক্টরি হবে । আপনি যদি আপনার প্রোগ্রামের ফাইলগুলিতে অ্যাক্সেস করেন তবে আপনি যদি আপেক্ষিক পাথগুলি ব্যবহার করেন বা (পছন্দসই) কেবলমাত্র কোথাও পুরোপুরি যোগ্যতাসম্পন্ন-পাথ ব্যবহার করেন এবং প্রত্যেককে পুরোপুরি বিভ্রান্তি থেকে বাঁচাতে পারেন তবে এটিকে অ্যাকাউন্টে নেওয়া দরকার।

আমার ক্রোন্টাবের শেষ কমান্ডটি চলবে না

ক্রোনকে সাধারণত প্রয়োজন হয় যে নতুন লাইন দিয়ে কমান্ড সমাপ্ত করা হবে। আপনার ক্রন্টব সম্পাদনা করুন; লাইনটির শেষ প্রান্তে যান যেখানে সর্বশেষ কমান্ড রয়েছে এবং একটি নতুন লাইন প্রবেশ করান (এন্টার টিপুন)।

ক্রন্টব ফর্ম্যাটটি পরীক্ষা করুন

আপনি / etc / crontab বা /etc/cron.d এর বিপরীতে কোনও ক্রন্টব বিন্যাসিত ক্রন্টব ব্যবহার করতে পারবেন না। একটি ব্যবহারকারী ফর্ম্যাট ক্রন্টব একটি সারির 6th ষ্ঠ অবস্থানে একটি ব্যবহারকারীর নাম অন্তর্ভুক্ত করে না, যখন একটি সিস্টেম বিন্যাসিত ক্রন্টব ব্যবহারকারীর নামটি অন্তর্ভুক্ত করে এবং সেই ব্যবহারকারী হিসাবে কমান্ড চালায়।

আমি একটি ফাইল /etc/cron- এ রেখেছি ourআসাহুলি, দৈনিক, সাপ্তাহিকভাবে, একমাসে - এবং এটি চালায় না

  • ফাইলনামটিতে রান-পার্টস দেখতে এক্সটেনশন নেই বলে দেখুন
  • ফাইলটির অনুমতি কার্যকর করার বিষয়টি নিশ্চিত করুন।
  • আপনার স্ক্রিপ্টটি কার্যকর করার সময় সিস্টেমটি কী ব্যবহার করবেন তা বলুন (যেমন #!/bin/shউপরে রাখুন)

ক্রোন তারিখ সম্পর্কিত বাগগুলি

যদি আপনার তারিখটি সম্প্রতি কোনও ব্যবহারকারী বা সিস্টেম আপডেট, টাইমজোন বা অন্য দ্বারা পরিবর্তিত হয়, তবে ক্রন্টব ভুলভাবে আচরণ শুরু করবে এবং উদ্ভট বাগগুলি প্রদর্শন করবে, কখনও কখনও কাজ করবে, কখনও কখনও নয়। এটি যখন চান নীচে থেকে সময় পরিবর্তন হয় তখন "আপনি যা চান তা করার" চেষ্টা করার ক্রোনটবের চেষ্টা। ঘন্টা পরিবর্তন হওয়ার পরে "মিনিট" ক্ষেত্রটি অকার্যকর হয়ে উঠবে। এই পরিস্থিতিতে, কেবলমাত্র তারাগুলি গ্রহণ করা হবে accepted ক্রোন পুনরায় আরম্ভ করুন এবং ইন্টারনেটে সংযুক্ত না হয়ে আবার চেষ্টা করুন (যাতে তারিখটি কোনও সময় সার্ভারে রিসেট করার সুযোগ পায় না)।

শতকরা লক্ষণ, আবার

শতাংশ লক্ষণ সম্পর্কে পরামর্শের উপর জোর দেওয়ার জন্য, ক্রোন তাদের সাথে কী করে তার একটি উদাহরণ এখানে:

# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz

3 লাইন যুক্ত ~ / cron.out ফাইল তৈরি করবে

foo
bar
baz

dateকমান্ডটি ব্যবহার করার সময় এটি বিশেষভাবে অনুপ্রবেশযোগ্য । শতকরা চিহ্ন থেকে বাঁচতে ভুলবেন না

* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"

'সীমাবদ্ধ এনএভিভি' বিভাগে উল্লেখ করতেও চাই যে এলডি_লিবিআরএআইএপিএটিএইচ ভাগ করে নেওয়া লাইব্রেরিগুলি খুঁজে পেতে অক্ষম হওয়ার কারণে আপনার ক্রোন টাস্কটি ব্যর্থ হওয়ায় কোনও অতিরিক্ত ডিরেক্টরি সেটও করতে হতে পারে।
ডেভিডজে

মনে রাখবেন আপনি এমনকি এটির মতো কিছু লিখতে পারেন: 35,1,5,7,9 এর পরিবর্তে * 1,5-23 / 2 * * * do_something, .. * * * * অতিরিক্তভাবে এই ক্রন্টব্রুরু আপনার করা এন্ট্রিগুলিকে অনুবাদ করে মানব ভাষা।
ডেনিস নোল্টে

1
আউটপুট ক্যাপচার আমার পক্ষে কাজ করে না, শ শেলের কারণে হতে পারে। আমি মনে করি এটি আরও পোর্টেবল: ... /path/to/your/command >/tmp/mycommand.log 2>&1
14:25 এ চুয়ে নিন

এটি আমার জন্য কাজ করেছে:sudo apt-get install postfix
জুমুনসচ

ক্রোন জব ফাইলের উপর নির্ভর করে কি ভারী? যেহেতু আমি ক্রোন দিয়ে অজগরটিতে সাধারণ হ্যালো ওয়ার্ল্ড ছড়িয়েছি, এটি কার্যকর হয়েছিল। তবে আমার দ্বিতীয় কোডটি কিছুটা ভারী ছিল এবং সাধারণত রান হয় তবে ক্রোন দিয়ে এটি ফাইলটিতে কোনও আউটপুট দিচ্ছে না।
দেবেন্দ্র ভাট

22

ডেবিয়ান লিনাক্স এবং এর ডেরাইভেটিভ (উবুন্টু, পুদিনা, ইত্যাদি) এর কিছু অদ্ভুততা রয়েছে যা আপনার ক্রোন জবগুলি কার্যকর করতে বাধা দিতে পারে; বিশেষ করে, ফাইলের মধ্যে /etc/cron.d, /etc/cron.{hourly,daily,weekly,monthly}অবশ্যই:

  • মূল দ্বারা মালিকানাধীন হতে
  • শুধুমাত্র মূল দ্বারা লিখনযোগ্য
  • গ্রুপ বা অন্যান্য ব্যবহারকারীদের দ্বারা লিখনযোগ্য না
  • কোনও বিন্দু ছাড়াই একটি নাম রাখুন '।' বা '-' এবং '_' ছাড়া অন্য কোনও বিশেষ চরিত্র।

সর্বশেষ একজন নিয়মিত সন্দেহ না করা ব্যবহারকারীদের ব্যথা দেয়; বিশেষ নামে এই ফোল্ডারগুলি এক যে কোন লিপিতে whatever.sh, mycron.py, testfile.pl, ইত্যাদি হবে না কার্যকর করা, কখনও।

আমার অভিজ্ঞতায়, এই নির্দিষ্ট বিন্দুটি ডেবিয়ান এবং ডেরিভেটিভসগুলিতে কোনও এক্সিকিউটিভ ক্রোনজব করার জন্য সবচেয়ে ঘন ঘন কারণ ছিল।

man cronপ্রয়োজনে আরও বিশদ জানতে দেখুন ।


19

যদি আপনার ক্রোনজবস কাজ বন্ধ করে দেয় তবে আপনার পাসওয়ার্ডের মেয়াদ শেষ হয়ে গেছে কিনা তা পরীক্ষা করুন once নীচের মত একই
বার্তাগুলি থাকবে /var/log/messagesযা ব্যবহারকারীকে প্রমাণীকরণের ক্ষেত্রে সমস্যাগুলি দেখায়:

(username) FAILED to authorize user with PAM (Authentication token is no longer valid; new one required)


2
ঠিক এটি পেয়েছি (আমার জন্য ত্রুটি বার্তা ফাইল / var / লগ / সিসলগ)। আমার ক্ষেত্রে একটি ডিজিটাল ওশান বাক্স যা তৈরি করার সময় তারা মূল পাসওয়ার্ডটি (বিকল্পভাবে) অন্য একটিতে পুনরায় সেট করে এবং আপনি সেখানে না গিয়ে এটি পরিবর্তন না করা পর্যন্ত সমস্ত ক্রোন জব চালায় না। হতাশাজনক। ফিক্স হ'ল এমন কিছুsudo -u root passwd
রজারডপ্যাক

12

অসাধারণ এবং অনিয়মিত শিডিউল

ক্রোনকে সমস্ত জিনিসকে খুব বেসিক শিডিয়ুলার হিসাবে বিবেচনা করা হয় এবং সিনট্যাক্সটি সহজেই প্রশাসককে কিছুটা বেশি অস্বাভাবিক সময়সূচী তৈরি করতে দেয় না।

নিম্নলিখিত কাজটি বিবেচনা করুন যা সাধারণত " commandপ্রতি 5 মিনিটে চালান " :

*/5 * * * * /path/to/your/command

বনাম:

*/7 * * * * /path/to/your/command

যা প্রতি minutes মিনিটে সর্বদা চলবে নাcommand

মনে রাখবেন যে /চরিত্রটি একটি পদক্ষেপ প্রবর্তনের জন্য ব্যবহার করা যেতে পারে তবে সেই পদক্ষেপগুলি সিরিজের সমাপ্তির পরেও মোড়ানো হয় না */7যা প্রতি 7 তম মিনিটে প্রতি মিনিটে 0-59 যেমন 0,7,14,21,28,35,42,49 মিলবে, 56 কিন্তু এক ঘন্টার এবং পরবর্তী মধ্যে থাকবে ব্যাচ মধ্যে মাত্র 4 মিনিট পর 00:56একটি নতুন ধারাবাহিক শুরু হয় 01:00, 01:07ইত্যাদি (এবং ব্যাচ উপর চলবে না 01:03, 01:10, 01:17ইত্যাদি)।


পরিবর্তে কী করবেন?

একাধিক ব্যাচ তৈরি করুন

একক ক্রোন জব না করে একাধিক ব্যাচ তৈরি করুন যা কাঙ্ক্ষিত সময়সূচীতে মিলিত হয় result

উদাহরণস্বরূপ প্রতি 40 মিনিটে ব্যাচ চালানোর জন্য (00:00, 00:40, 01:20, 02:00 ইত্যাদি) দুটি ব্যাচ তৈরি করুন, একটি এমন যা সন্ধ্যার সময় দু'বার চালিত হয় এবং দ্বিতীয়টি কেবল বিজোড় ঘন্টাগুলিতে চলে:

# The following lines create a batch that runs every 40 minutes i.e.

# runs on   0:00, 0:40,        02:00, 02:40         04:00 etc to 22:40
0,40 */2 * * * /path/to/your/command

# runs on               01:20,               03:20,       etc to 23:20
20 1/2 * * * /path/to/your/command

# Combined: 0:00, 0:40, 01:20, 02:00, 02:40, 03:20, 04:00 etc.

আপনার ব্যাচগুলি কম ঘন ঘন চালান

আপনার ব্যাচটি প্রতি minutes মিনিটে চালানোর পরিবর্তে একাধিক ব্যাচে ভাঙা একটি কঠিন সময়সূচী, পরিবর্তে প্রতি 10 মিনিটের মধ্যে এটি চালান।

আপনার ব্যাচগুলি আরও ঘন ঘন শুরু করুন (তবে একযোগে একাধিক ব্যাচ চালানো থেকে বিরত থাকুন)

অনেকগুলি অদ্ভুত সময়সূচী বিবর্তিত হয় কারণ ব্যাচের রানটাইমগুলি বৃদ্ধি / ওঠানামা করে এবং তারপরে একই ব্যাচের পরবর্তী রানগুলি ওভারল্যাপিং এবং একই সাথে চলমান থেকে রোধ করতে ব্যাচগুলি কিছুটা অতিরিক্ত সুরক্ষা মার্জিনের সাথে নির্ধারিত হয়।

পরিবর্তে, অন্যভাবে চিন্তা করুন এবং এমন একটি ক্রোনজব তৈরি করুন যা পূর্বের রানটি এখনও শেষ না হয়ে চূড়ান্তভাবে ব্যর্থ হবে, তবে যা অন্যথায় চলবে। এই প্রশ্নোত্তর দেখুন :

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job 

পূর্ববর্তী / ইউএসআর / লোকাল / বিন / ঘনঘন_ক্রোন_জব শেষ হয়ে গেলে এটি প্রায় তাত্ক্ষণিকভাবে একটি নতুন রান শুরু করবে।

আপনার ব্যাচগুলি আরও ঘন ঘন শুরু করুন (তবে শর্তগুলি ঠিক না হলে মনোযোগ দিয়ে প্রস্থান করুন)

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

বাশ-এর ​​মধ্যে seven-minute-jobএমন কিছুর মতো দেখতে লাগবে:

#!/bin/bash
# seven-minute-job
# This batch will only run when 420 seconds (7 min) have passed
# since the file /tmp/lastrun was either created or updated

if [ ! -f /tmp/lastrun ] ; then
    touch /tmp/lastrun
fi

if [ $(( $(date +%s) - $(date -r /tmp/lastrun +%s) )) -lt 420 ] ; then
     # The minimum interval of 7 minutes between successive batches hasn't passed yet.
    exit 0
fi

####  Start running your actual batch job below

/path/to/your/command

#### actual batch job is done, now update the time stamp
date > /tmp/lastrun
#EOF

যা আপনি প্রতি মিনিটে নিরাপদে চালানোর (চেষ্টা) করতে পারেন:

* * * * * /path/to/your/seven-minute-job

একটি ভিন্ন কিন্তু একই সমস্যা প্রতি মাসের প্রথম সোমবার (বা দ্বিতীয় বুধবার) ইত্যাদি চালানোর একটি ব্যাচ নির্দিষ্ট সময় নির্ধারণের জন্য হবে কেবলমাত্র প্রতি সোমবার করে প্রস্থান চালানোর জন্য ব্যাচ নির্দিষ্ট সময় নির্ধারণের যখন তারিখ 1 এর মধ্যে তন্ন তন্ন হয় St বা 7 এবং সপ্তাহের দিন সোমবার নয়।

#!/bin/bash
# first-monday-of-the-month-housekeeping-job

# exit if today is not a Monday (and prevent locale issues by using the day number) 
if [ $(date +%u) != 1 ] ; then
  exit 0
fi

# exit if today is not the first Monday
if [ $(date +%d) -gt 7 ] ; then
  exit 0
fi

####  Start running your actual batch job below

/path/to/your/command

#EOF

যা আপনি প্রতি সোমবার নিরাপদে চালানোর (চেষ্টা) করতে পারেন:

0 0 * * 1 /path/to/your/first-monday-of-the-month-housekeeping-job

ক্রোন ব্যবহার করবেন না

আপনার প্রয়োজনীয়তাগুলি যদি জটিল হয় তবে আপনি আরও উন্নত পণ্য ব্যবহারের বিষয়টি বিবেচনা করতে পারেন যা জটিল শিডিয়ুলগুলি চালানোর জন্য ডিজাইন করা হয়েছে (একাধিক সার্ভারের মাধ্যমে বিতরণ করা হয়েছে) এবং এটি ট্রিগার, কাজের নির্ভরতা, ত্রুটি পরিচালনা, পুনরায় চেষ্টা ও পুনরীক্ষণ ইত্যাদি সমর্থন করে j " কাজের সময়সূচী এবং / অথবা" ওয়ার্কলোড অটোমেশন "।


8

পিএইচপি-ভিত্তিক

আপনার যদি কিছু ক্রোন জব থাকে তবে:

php /bla/bla/something.php >> /var/logs/somelog-for-stdout.log

এবং ত্রুটির ক্ষেত্রে যদি আশা হয় যে সেগুলি আপনাকে প্রেরণ করা হবে তবে তারা তা নয় - এটি পরীক্ষা করে দেখুন।

পিএইচপি ডিফল্টভাবে ত্রুটিগুলি STDOUT এ পাঠাচ্ছে না। @se https://bugs.php.net/bug.php?id=22839

এটি ঠিক করার জন্য, ক্লাইজের php.ini বা আপনার লাইনে (বা পিএইচপি-র জন্য আপনার ব্যাশ র‍্যাপারে) যুক্ত করুন:

  • --পরিচয় প্রদর্শন_স্টার্টআপ_অর্থগুলি = 1
  • --define display_erferences = 'stderr'

1 ম সেটিং আপনাকে 'মেমরি ওফস' এবং 2 য়ের মতো মারাত্মকতা থাকতে দেয় - সেগুলি এসটিডিআরআরে পুনর্নির্দেশ করতে। আপনি ঠিক মতো ঘুমাতে পারার পরে কেবল সমস্ত লগইন না করে আপনার রুটের মেইলে প্রেরণ করা হবে।


2
সেই ত্রুটি প্রতিবেদনটি 2007 এ পিএইচপি 5.2+ শাখায় প্যাচের স্থিতি যুক্ত হওয়ার সাথে সাথে বন্ধ করা হয়েছিল। আপনি কি নিশ্চিত যে এটি প্রয়োজন? আমি কেবল পিএইচপি 5.4 এ চেষ্টা করেছি এবং মনে হচ্ছে এটি ঠিক আছে। (যদিও এটি পিএইচপি 4 এর জন্য এখনও প্রয়োজন)।
শিওনক্রস

@ এক্সনক্রস উত্তরের তারিখ দেখুন :)
গারেক্স

1
হ্যাঁ, আপনি 2013 সালে উত্তর দিয়েছিলেন এবং টিকিটটি '07 এ ফিরে আসার পর থেকেই এটি আমাকে বিভ্রান্ত করেছে।
জিওনক্রস

0

সম্পূর্ণতার জন্য এখানে থেকে আমার উত্তর যুক্ত করা, এবং অন্য সম্ভাব্য সহায়ক সংস্থান যোগ:

cronব্যবহারকারী একটি ভিন্ন হয়েছে $PATHআপনি একটি করুন:

ব্যবহারকারীরা crontabএন্ট্রি দিয়ে ঘন ঘন সমস্যাটি হ'ল তারা ভুলে গেছে যে লগ-ইন করা ব্যবহারকারী হিসাবে তার চেয়ে cronআলাদা চলে in environmentউদাহরণস্বরূপ, একজন ব্যবহারকারী তার $HOMEডিরেক্টরিতে একটি প্রোগ্রাম বা স্ক্রিপ্ট তৈরি করে এবং এটি চালানোর জন্য নিম্নলিখিত কমান্ডটি প্রবেশ করে:

$ ./certbot ... 

কমান্ডটি তার কমান্ড লাইন থেকে পুরোপুরি চলে runs তারপরে ব্যবহারকারী তার কাছে এই আদেশটি যুক্ত করে crontab, তবে এটি কার্যকর হয় না:

*/10 * * * * ./certbot ....

এই ক্ষেত্রে ব্যর্থতার কারণ হ'ল এটি লগ-ইন করা ব্যবহারকারীর চেয়ে ব্যবহারকারীর ./জন্য আলাদা অবস্থান cron। অর্থাৎ, environmentআলাদা! PATH এর অংশ environment, এবং এটি cronব্যবহারকারীর পক্ষে সাধারণত আলাদা । এই সমস্যা তাই আগাম যে environmentজন্য cronসবার জন্য সমান নয় * স্নো ডিস্ট্রিবিউশন, এবং আছে একাধিক সংস্করণcron

এই নির্দিষ্ট সমস্যার সহজ সমাধান হ'ল cronব্যবহারকারীকে crontabপ্রবেশের ক্ষেত্রে একটি সম্পূর্ণ পথের স্পেসিফিকেশন প্রদান :

0 22 * * * /path/to/certbot .....

কি cronব্যবহারকারীর environment?

কিছু ক্ষেত্রে, আমাদের আমাদের সিস্টেমে সম্পূর্ণ environmentস্পেসিফিকেশন cronজানতে হবে (অথবা আমরা কেবল কৌতূহলী হতে পারি)। ব্যবহারকারীর জন্য কী এবং এটি আমাদের থেকে কীভাবে আলাদা? environmentcronআরও, আমাদের environmentঅন্য cronব্যবহারকারীর জন্য জানা দরকার - rootউদাহরণস্বরূপ ... rootব্যবহারকারীর কী environmentব্যবহার হচ্ছে cron? এটি শেখার একটি উপায় cronআমাদের বলতে জিজ্ঞাসা করা:

  1. আপনার হোম ডিরেক্টরিতে ( ~/) নিজের শেল স্ক্রিপ্ট তৈরি করুন (বা আপনার পছন্দের সম্পাদক সহ):
$ nano ~/envtst.sh
  1. আপনার সিস্টেম / ব্যবহারকারীর জন্য সামঞ্জস্য করার পরে সম্পাদকটিতে নিম্নলিখিতটি প্রবেশ করান:
#!/bin/sh 
/bin/echo "env report follows for user "$USER >> /home/you/envtst.sh.out 
/usr/bin/env >> /home/you/envtst.sh.out 
/bin/echo "env report for user "$USER" concluded" >> /home/you/envtst.sh.out
/bin/echo " " >> /home/you/envtst.sh.out
  1. ফাইলটি সংরক্ষণ করুন, সম্পাদক থেকে প্রস্থান করুন এবং এক্সিকিউটেবল হিসাবে ফাইল অনুমতি সেট করুন।
$ chmod a+rx ~/envtst.sh
  1. আপনি সবে তৈরি স্ক্রিপ্টটি চালান এবং এতে আউটপুটটি পর্যালোচনা করুন /home/you/envtst.sh.out$USERআপনি যেভাবে লগ ইন করেছেন তা এই আউটপুটটি আপনার বর্তমান পরিবেশটি প্রদর্শন করবে :
$ ./envtst.sh $$ cat /home/you/envtst.sh.out
  1. crontabসম্পাদনার জন্য আপনার খুলুন :
$ crontab -e -u root
  1. আপনার নীচে নীচের লাইনটি প্রবেশ করান crontab:
* * * * *  /home/you/envtst.sh >> /home/you/envtst.sh.err 2>&1

উত্তর: আউটপুট ফাইলটিতে "রুট ক্রোন ব্যবহারকারী" এর জন্য /home/you/envtst.sh.outএকটি তালিকা থাকবে environment। একবার আপনি এটি জানার পরে, crontabসেই অনুযায়ী আপনার এন্ট্রি সামঞ্জস্য করুন ।

আমি আমার crontabপ্রবেশের সময়সূচী নির্দিষ্ট করতে পারি না :

এর শিডিউল এন্ট্রি crontabঅবশ্যই সংজ্ঞায়িত করা হয়েছে man crontabএবং আপনার এটি পড়া উচিত। যাইহোক, পড়া man crontabএবং সময়সূচী বোঝা দুটি ভিন্ন জিনিস। এবং তফসিলের নির্দিষ্টকরণের ট্রায়াল-এন্ড ত্রুটি খুব ক্লান্তিকর হয়ে উঠতে পারে । ভাগ্যক্রমে, এমন একটি সংস্থান রয়েছে যা সাহায্য করতে পারে: ক্রন্টব গুরু। । আপনার সময়সূচির বিশদ উল্লেখ করুন এবং এটি শিষ্টির সরল ইংরাজী ভাষায় ব্যাখ্যা করবে explain

শেষ অবধি, এবং এখানে অন্য উত্তরগুলির সাথে অপ্রয়োজনীয় হওয়ার ঝুঁকিতে, আপনি একক crontabপ্রবেশে সীমাবদ্ধ রয়েছেন বলে ভেবে আটকাবেন না কারণ আপনার কাজ শিডিউল করার একটি কাজ রয়েছে। crontabআপনার প্রয়োজনীয় সময়সূচিটি পাওয়ার জন্য আপনি যতগুলি এন্ট্রি ব্যবহার করতে পারবেন তা মুক্ত।

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