আমি কীভাবে প্রতিদিন 1 ঘন্টা পরে ক্রোনজব শুরু করতে পারি?


16

আমার প্রতিদিন ক্রোনজব শুরু করা দরকার, তবে প্রতিদিন এক ঘন্টা পরে। আমার এখন পর্যন্ত যা আছে তা বছরের 1 দিন বাদে বেশিরভাগ অংশের জন্য কাজ করে:

0 0 * * * sleep $((3600 * (10#$(date +\%j) \% 24))) && /usr/local/bin/myprog

বছরের দিনটি যখন 365 হয় তখন কাজটি 5:00 এ শুরু হবে, তবে পরের দিন (লিপ বছর গণনা করা হবে না) হিসাবে বছরের একটি দিন থাকবে 1, তাই কাজটি শুরু হবে 1:00 এ at আমি এই কর্নার কেস থেকে কীভাবে মুক্তি পাব?


1
এটি প্রতি 25 ঘন্টা অন্তর শুরু না করার কোনও কারণ?
হালোসঘস্ট

7
এবং আপনি ঠিক কিভাবে এটি করতে হবে? * / 25 ঘন্টা পজিশনে এটি সমাধান করবে না।
বার্চ

@ হালোসগোস্ট আপনার পরামর্শের জন্য ধন্যবাদ! আমি এ ভিত্তিতে একটি সহজ বাস্তবায়ন লিখেছি।
গিয়ুলিও মুশকেলো

উত্তর:


23

আমার পছন্দের সমাধানটি হ'ল প্রতি ঘন্টা কাজ শুরু করা কিন্তু স্ক্রিপ্ট নিজেই পরীক্ষা করে নেওয়ার সময় এসেছে কিনা তা পরীক্ষা করে দেখুন এবং 25 এর মধ্যে 24 বার কিছু না করে প্রস্থান করতে পারেন।

নিম্নলিখিতরূপে crontab পরিবর্তন:

0 * * * *    /usr/local/bin/myprog

শীর্ষে myprog:

[ 0 -eq $(( $(date +%s) / 3600 % 25 )) ] || exit 0

আপনি যদি স্ক্রিপ্টে নিজেই কোনও পরিবর্তন করতে চান না, আপনি ক্রন্টব এন্ট্রিতে "চালানোর সময়" চেকও রাখতে পারেন তবে এটি দীর্ঘ কদর্য লাইন তৈরি করে:

0 * * * *    [ 0 -eq $(( $(date +\%s) / 3600 \% 25 )) ] && /usr/local/bin/myprog

1
ক্রন্টেব ব্যাকস্ল্যাশ নিয়ে '%' এর পালাতে হবে।
বার্চ

@ বিবিরিচ আমি কখনই জানতাম না! আমার ধারণা আমি এর আগে কোনও ক্রন্টবায়%% অন্তর্ভুক্ত করার চেষ্টা করিনি। সংশোধনের জন্য ধন্যবাদ, আমি উত্তর সম্পাদনা করেছি।
সেলেদা

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

বিভাগে গোল করার বিষয়ে আমি কিছুটা চিন্তিত হব। যদি কোনও কারণে dateকার্নেল থেকে ফিরে আসা 1msসময়টি আপনি স্ক্রিপ্টটি চালানোর প্রত্যাশার আগে হয় তবে চেকটি একটি ভুল ফল দেয়।
ক্যাস্পারড

1
@ ক্যাস্পার্ড আমি জানি না, আমি মনে করি আপনি বিভিন্ন সিপিইউ বিভিন্ন সময় রিপোর্ট করার বিষয়ে সঠিক হতে পারেন। হিসাবে ntpd, এটা চেষ্টা শুধুমাত্র ঘড়ি হত্যা করল, এটা তিড়িং লাফ, নির্দিষ্টভাবে সমস্যা এই ধরনের এড়াতে না, কিন্তু তুমি ঠিক আছে, এটা (অথবা ntpdate) কখনও কখনও সময় পিছন তিড়িং লাফ পারেন। হিসাবে cronতার ঘুম বিলম্ব miscalculating, আমি নিশ্চিত যে একটি বাগ বিবেচিত হবে নই! এখনও, বিন্দু নিয়ে যাওয়া, এবং একটি কার্যসংক্রান্ত সমস্যা সৃষ্টি ... অথবা reamainder গ্রহণের পূর্বে গাণিতিক এক্সপ্রেশন মধ্যে ± 1800 যোগ কাজ নির্দিষ্ট সময় নির্ধারণের জন্য ঘন্টা যা কম সম্ভাবনা রয়েছে বিগত 30 মিনিট হবে mod 3600.
Celada

7

যদি আপনার সিস্টেমে সিস্টেম থাকে, আপনি এটির জন্য টাইমার ইভেন্টগুলি ব্যবহার করতে পারেন। কেবলমাত্র একটি নতুন পরিষেবা সংজ্ঞায়িত করুন , যার মধ্যে আপনি চালাতে চান কমান্ড / কার্য থাকতে হবে এবং তারপরে OnUnitActiveSecবিকল্পটি সহ একটি টাইমার ইভেন্ট তৈরি করতে হবে :

[Unit]
Description=daily + 1 hour task

[Timer]
OnUnitActiveSec=25h # run 25 hours after service was last started
AccuracySec=10min

[Install]
WantedBy=timers.target

.serviceআপনার ব্যবহারের পরিবর্তে ফাইলগুলির জন্য একই নামটি ব্যবহার করুন .timer

সংশ্লেষিত:

  1. নামক কোনো ফাইল তৈরি করুন job.serviceমধ্যে /etc/systemd/system/ডিরেক্টরি।
  2. প্রয়োজনীয় তথ্য দিয়ে এটি পূরণ করুন। ব্যবহার করে আপনি কনফিগারেশন যাচাই করতে পারেন systemctl status job.service
  3. নামক কোনো ফাইল তৈরি করুন job.timerমধ্যে /etc/systemd/system/
  4. প্রয়োজনীয় তথ্য দিয়ে এটি পূরণ করুন:

    [Unit]
    Description=daily + 1 hour task
    
    [Timer]
    OnUnitActiveSec=25h # run 25 hours after service was last started
    AccuracySec=10min
    
    [Install]
    WantedBy=timers.target
    
  5. টাইমার ব্যবহার করে যাচাই করুন systemctl list-timers
  6. সম্পন্ন.

যদি আমি ক্রোনের সরলতা থেকে বিপথগামী হয়ে যাচ্ছিলাম, তবে আমি লঞ্চড ব্যবহার করব, যার জন্য সিস্টেমডের জন্য আপনার উদাহরণের চেয়ে কম কাজ প্রয়োজন।
বার্চ

6

আপনি cronjobs ছাড়া অন্য কিছু ব্যবহার কিছু মনে না করেন, আমি স্বল্প-পরিচিত ইউটিলিটি সুপারিশ করবে at। কেবল একটি মোড়ক স্ক্রিপ্ট লিখুন যা উভয়ই 25 ঘন্টার মধ্যে নিজেই চালানোর সময়সূচি দেয় এবং তারপরে আপনার প্রোগ্রামটিকে কল করে। এটি সবচেয়ে পরিষ্কার সমাধান বলে মনে হচ্ছে।
উদাহরণস্বরূপ, আপনি এটি ~ / স্ক্রিপ্ট.শ্রে লিখতে পারেন:

echo "bash ~/script.sh" | at now + 25 hours
/usr/bin/yourprogram

এবং তারপর কেবল bash ~/script.shএকবার চালানো ।

25 ঘন্টা একবার কাজ শিডিউল করার ধারণার জন্য @ হ্যালসগোস্টকে ধন্যবাদ জানাই।


2
atএই উদ্দেশ্যে ব্যবহারের ক্ষেত্রে 2 টি সমস্যা রয়েছে : (1) যদি কাজটি একবারেও সঠিকভাবে সম্পাদন করতে ব্যর্থ হয় তবে এটি নিজেই পুনরায় নির্ধারণ করতে ব্যর্থ হয় এবং তারপরে কেবল পরবর্তী মৃত্যুদন্ড কার্যকর হয় না তবে ভবিষ্যতের সমস্ত মৃত্যুদণ্ড কার্যকরভাবে কোনও বিজ্ঞপ্তি বাতিল করা হয় এবং (২) যেহেতু কাজটি চালাতে কিছুটা অ-শূন্য সময় লাগে, নিষ্পাপ ব্যবহারের now + 25 hoursঅর্থ এটি প্রতি কয়েক সেকেন্ড (বা আরও) পরে চলবে, আনফ এই ল্যাগটি সময়ের সাথে সাথে গড়ে উঠবে, ফলে এটি পুরোপুরি ভুল পথে চালিত হবে সময়।
সেলেদা

2
আপনি # 1 সম্পর্কে সঠিক; আমি # 2 সম্পর্কে তেমন নিশ্চিত নই। যদিও আমার কাছে কোনও ডেটা নেই, তবে আমি মনে করি না যে ঘড়ির পরিবর্তন এবং কাজের সূত্রপাত এবং পরবর্তী সময়ে পুনর্নির্ধারণের মধ্যে বিলম্ব যথেষ্ট লক্ষণীয় বলে বিবেচনা করতে পারে - বিশেষত বিবেচনা করে যে এর রেজুলেশন কয়েক atমিনিটের মধ্যে সীমাবদ্ধ এবং সমস্ত কাজ শুরু করে [সময়ে]: 00
জিউলিও মুসকেল্লো

1
@ কেলাডা: স্ক্রিপ্টে প্রথম কাজটি পরবর্তী atকাজটি নির্ধারণ করা এই সমস্যাগুলি এড়িয়ে চলে। তবুও, যদি কোনও ত্রুটি দেখা দেয় তবে পুরো শৃঙ্খলটি নষ্ট হয়ে যায়, যা কাঙ্ক্ষিত বা নাও হতে পারে: যদি ব্যবহারের কেসটি "এটি কাজ করে তখন কেবল এটি চালানো হয়", পুনরায় চালু না করা একটি দুর্দান্ত বৈশিষ্ট্য। তবে যদি ব্যবহারের কেসটি সর্বদা চালিত হয়, যদিও সর্বশেষ ব্যর্থ হয় "তবে সঠিক সরঞ্জামটি নয়। at
বিশপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.