আমি কীভাবে প্রোগ্রামক্রমে নতুন ক্রোন জব তৈরি করতে পারি?


129

আমি ক্রমবর্ধমানভাবে একটি নতুন ক্রোন জব যুক্ত করতে সক্ষম হতে চাই, এটি করার সর্বোত্তম উপায় কী?

আমার গবেষণা থেকে মনে হয় যে আমি বর্তমান ক্রন্টব ডাম্প করতে পারি এবং তারপরে একটি নতুন সংযোজন করতে পারি, এটি আবার ক্রন্টবায় ফিরিয়ে দিতে:

(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -

একটি ভাল উপায় আছে কি?


2
আপনার সমাধানটি বেশ ভাল বলে মনে হচ্ছে।
ক্রেগ এস

সোলারিসে কেবল শেষ ক্রোন্তাবের জন্য ড্যাশ সরান। ইতিমধ্যে সেখানে একটি লাইন যুক্ত এড়ানোর জন্য আপনি একটি গ্রেপ যোগ করতে পারেন।
lacroix1547


বন্ধনীগুলির পরিবর্তে কোঁকড়া ধনুর্বন্ধনী এটি কোনও প্রক্রিয়া তৈরি না করেই করবে। ধনুর্বন্ধনী চারপাশে ফাঁকা স্থান রাখা নিশ্চিত করুন, {...; }।
জে উইনস্টন

উত্তর:


-25

এটি আমার জন্য সর্বদা ভাল কাজ করেছে।

আপনার কিছুটা পরিশীলিত স্ক্রিপ্ট বিবেচনা করা উচিত যা তিনটি জিনিস করতে পারে।

  1. একটি ক্রন্টব লাইন যুক্ত করুন; আশ্বাস দিচ্ছি যে এর কোন অস্তিত্বই ছিল না। ইতিমধ্যে উপস্থিত থাকলে যুক্ত করা খারাপ is

  2. ক্রন্টব লাইন সরান। এটি উপস্থিত না থাকলে সম্ভবত কেবল সতর্কতা।

  3. ক্রন্টব লাইন প্রতিস্থাপন করতে উপরের দুটি বৈশিষ্ট্যের সংমিশ্রণ।


78
তিনি জিজ্ঞাসা করলেন কীভাবে এবং আপনি তাকে কী বলবেন?
সেরিন 14 ই

1
যদি ব্যবহারকারীটির কাছে এখনও কোনও ক্রন্টব না থাকে?
ম্যাক্সিম এগারুশকিন

132

আপনি যদি রুট হিসাবে চালাচ্ছেন তবে সর্বোত্তম উপায় হ'ল একটি ফাইল /etc/cron.d এ ফেলে দেওয়া

আপনি যদি আপনার সফ্টওয়্যারটি প্যাকেজ করার জন্য কোনও প্যাকেজ ম্যানেজার ব্যবহার করেন, আপনি কেবল সেই ডিরেক্টরিতে ফাইলগুলি লিখতে পারেন এবং সেগুলি ব্যাখ্যা করা হয় যেন সেগুলি ক্রন্টব্যাব, তবে ব্যবহারকারীর নামের অতিরিক্ত ক্ষেত্র সহ, যেমন:

ফাইলের নাম: /etc/cron.d/per_minute

বিষয়বস্তু: * * * * * root /bin/sh /home/root/script.sh


5
ব্যবহারের ক্রোনটির সংস্করণ /etc/cron.d/ সমর্থন করে তা নিশ্চিত করুন। বেশিরভাগ আধুনিক লিনাক্স বিতরণ করে।
স্লেসকে

8
এটি সহজতম, সবচেয়ে মার্জিত সমাধান। অবশ্যই অন্যান্য প্রাসঙ্গিক এন্ট্রিগুলির সাথে বিদ্যমান ক্রন্টবকে পার্স করতে এবং সম্পাদনা করতে হবে তা নিশ্চিত ats
সেরিন 14 ই

13
এর একটি সম্ভাব্য সাবধানতা হ'ল ফ্রিকোয়েন্সি যেখানে ক্রোন এই ফোল্ডারে নতুন সংযোজন করে (প্রতি ঘন্টা একবার)। আপনি যদি আশা করেন যে আপনার কাজটি এখনই চলতে শুরু করবে, সাবধান হন।
JonathanK

6
@ জোনাথনক, ক্রোনকে পুনরায় স্ক্যান করতে বলা যেতে পারে কিনা তা আপনি কি জানেন /etc/cron.d/*? চেক করার জন্য যদি এক ঘন্টা অপেক্ষা করতে হয় তবে কিছু কাজ করছে কিনা তা জানা শক্ত!
অর্ধ

4
এই ফাইলটির জন্য পার্মস কীভাবে সেট করা উচিত? chmod + x /etc/cron.d/per_minute?
giò

101

ওপির সমাধানটিতে একটি ত্রুটি রয়েছে, এটি দু'বার এন্ট্রি যুক্ত হতে পারে, ঠিক করার জন্য নীচে ব্যবহার করুন।

(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -

5
বর্ণনা করা সমাধান না হলে এটি আসলে আরও ভাল। এটি কমান্ডটি ক্রন্টব-এ দু'বার যুক্ত না হওয়া নিশ্চিত করে।
বুফকে

2
সদৃশ এন্ট্রি ইস্যুটির পক্ষে এটি খুব ভাল সমাধান fix এর মধ্যে যদি অন্য লাইনটি ক্রন্টবায় যুক্ত হয় তবে কী হবে?
hmn

6
স্বতন্ত্রতা নিশ্চিত করতে, ঠিক sortআগে uniq, যেমন:(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
15:38

6
দরকার নেই uniq-uবিকল্পটি ব্যবহার করুন sort
পাপিরো

6
আমি যখন ক্রোনটব প্রথম সম্পাদনা করি তখন কীভাবে ব্যবহারকারীর জন্য কোনও ক্রন্টব এড়ানো যায় না
wyx

23

ক্রোন কিছু যুক্ত করতে

(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | sort | uniq | crontab -

এটি ক্রোন থেকে অপসারণ করতে

(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | grep -v hupChannel.sh |  sort | uniq | crontab -

আশা কেউ সাহায্য করবে


এটি ঠিক আমি যা খুঁজছিলাম তা কেবল এটি যুক্ত করব: | grep -v '। #' | মন্তব্যগুলি ফিল্টার করতে
টিজুনকি

2
আপনার আসলে দরকার নেই 2>&1 | grep -v "no crontab"কারণ যখন কোনও ক্রন্টব নেই তখন আউটপুট লাইনটি crontab: no crontab for...স্ট্ডারকে প্রেরণ করা হয়। সেই আউটপুট ক্যাপচার করার কোনও কারণ নেই, এটি স্টডআউটে প্রেরণ করুন এবং তারপরে গ্রেপ ব্যবহার করে ফিল্টার আউট করুন। যদি আপনার লক্ষ্যটি crontab: no crontab for...যদি আপনার আউটপুটটি না দেখা যায় তবে ব্যবহার করুন 2> /dev/null | sort....
ম্যাটি



5

ধরে নিলাম যে আপনার ক্রোনটাবটিতে ইতিমধ্যে একটি প্রবেশ রয়েছে, নিম্নলিখিত কমান্ডটি তুলনামূলকভাবে ভাল কাজ করা উচিত। নোট করুন যে $CMDপরিবর্তনশীল কেবল পঠনযোগ্যতার জন্য রয়েছে। সদৃশ ফিল্টার করার আগে বাছাই করা গুরুত্বপূর্ণ, কারণ uniqকেবল সংলগ্ন লাইনে কাজ করে।

CMD='wget -O - -q http://www.example.com/cron.php"'
(crontab -l ; echo "0 * * * * $CMD") | sort | uniq | crontab -

আপনার যদি বর্তমানে একটি খালি ক্রন্টব রয়েছে, আপনি স্টাডারকে নিম্নলিখিত ত্রুটিটি পাবেন:

no crontab for user

আপনি যদি এড়াতে চান তবে আপনি কিছুটা জটিলতা যুক্ত করতে পারেন এরকম কিছু করুন:

(crontab -l ; echo "0 * * * * $CMD") 2>&1 | sed "s/no crontab for $(whoami)//"  | sort | uniq | crontab -

5

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

আপনি সুন্দর মার্জিতভাবে এটি করতে পাইপ ব্যবহার করতে পারেন।

ক্রোনট্যাব সম্পূর্ণরূপে পুনর্লিখন করতে, করুন

echo "2 2 2 2 2 /bin/echo foobar" |crontab -

এখানে বর্ণিত অন্যান্য উত্তরগুলির সাথে একত্রিত করা সহজ হওয়া উচিত

crontab -l | <something> | tee |crontab -

অথবা, আপনার যদি কোনও ফাইলে বিষয়বস্তু থাকে তবে এটি আরও সহজ

cat <file> |crontab -

3

এখানে অন্য এক-লাইনার উপায়, যা সদৃশগুলি এড়িয়ে চলে

(crontab -l 2>/dev/null | fgrep -v "*/1 *  *  *  * your_command"; echo "*/1 *  *  *  * your_command") | crontab -

এবং এখানে জোনজেডের উত্তরটি দেওয়ার এবং no crontab for userবার্তা এড়ানোর একটি উপায় রয়েছে , বা যদি আপনাকে কোনও set -euধরণের পরিবেশে পরিচালনা করতে হয় এবং কিছুতেই ব্যর্থতা ফিরে না পাওয়া যায় (এই ক্ষেত্রে 2>/dev/nullঅংশটি isচ্ছিক হয়):

( (crontab -l 2>/dev/null || echo "")  ; echo "0 * * * * your_command") | sort -u - | crontab -

অথবা আপনি যদি জিনিসগুলিকে আলাদা করতে চান তবে সেগুলি আরও পাঠযোগ্য:

new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
(echo "$preceding_cron_jobs" ; echo "$new_job") | sort - | uniq - | crontab -

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

new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
preceding_cron_jobs=$(echo "$preceding_cron_jobs" | grep -v your_command )
(echo "$preceding_cron_jobs" ; echo "$new_job") | crontab -

2

ম্যান ক্রোনটবও দরকারী:

নিম্নলিখিতরূপে crontab পরিবর্তন (1)

NAME এর

   crontab - manipulate per-user crontabs (Dillon's Cron)

সংক্ষিপ্তসার

   crontab file [-u user] - replace crontab from file

   crontab - [-u user] - replace crontab from stdin

   crontab -l [user] - list crontab for user


2

জনজেডের উত্তরে যুক্ত করা হচ্ছে, আপনি যদি সফল হন তবে মূল হিসাবে নির্ধারিত সিনট্যাক্সটি এখানে:

(sudo crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | sudo crontab -

1
function cronjob_exists($command){

    $cronjob_exists=false;

    exec('crontab -l', $crontab);


    if(isset($crontab)&&is_array($crontab)){

        $crontab = array_flip($crontab);

        if(isset($crontab[$command])){

            $cronjob_exists=true;

        }

    }
    return $cronjob_exists;
}

function append_cronjob($command){

    if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE){

        //add job to crontab
        exec('echo -e "`crontab -l`\n'.$command.'" | crontab -', $output);


    }

    return $output;
}

    append_cronjob('* * * * * curl -s http://localhost/cron/test.php');

1

এটি নিশ্চিত করার জন্য আপনার কমান্ডটি যুক্ত করার আগে ইতিমধ্যে বিদ্যমান নেই কিনা তা পরীক্ষা করে দেখাবে।

crontab -l 2>/dev/null | grep -q '/path/to/script' || echo "5 * * * * /path/to/script" | crontab -

চিয়ার্স।


0

স্টাইডাউটে পাইপিং crontabম্যাকোসে আমার জন্য নতুন ক্রন্টব ইনস্টল করেনি, সুতরাং teeসাব শেলটিতে সম্পাদকটি ব্যবহার করে পরিবর্তে আমি এই সমাধানটি পেয়েছি :

(EDITOR=tee && (crontab -l ; echo "@daily ~/my-script.sh" ) | uniq - | crontab -e)

0

আপনি যদি ব্যবহারকারী হিসাবে টাস্কটি চালাতে চান:

crontab -l | { cat; echo "@weekly what_you_want_to_execute"; } | crontab -

আপনি যদি টাস্কটি সুবিধাগুলি সহ চালনা করতে চান:

sudo crontab -l | { cat; echo "@weekly what_you_want_to_execute"; } | sudo crontab -

এবং চেক টাস্ক ('সুডো' সহ বা ছাড়াই):

crontab -l | sed '/^$/d; /#/d'

-1

এছাড়াও আপনি আপনার কাজগুলিকে /etc/cron.*/ এ যুক্ত করতে পারেন


-2

আপনি ক্রোন টেবিল পাঠ্য ফাইলটি সরাসরি সম্পাদনা করতে পারেন তবে আপনার সমাধানটি পুরোপুরি গ্রহণযোগ্য বলে মনে হচ্ছে।


1
ফাইল দুর্নীতির কারণ সহবর্তী সম্পাদনার সুযোগের উদ্বেগের কারণে আমি এই উদ্রেক করবো। কমান্ড-লাইন crontab কমান্ড ব্যবহার করে সেই সমস্যাটি এড়ানো উচিত।
ক্রেগ এস

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

"সরাসরি ফাইল সম্পাদনা" রুট অ্যাক্সেস ব্যতীত সম্ভব নয় (আপনি যদি বুঝতে পারেন যে ব্যবহারকারীর ক্রন্টব ফাইলটি কোথায় থাকে এবং ক্রোন ডেমোন সঠিকভাবে আপনার পরিবর্তনগুলি কীভাবে গ্রহণ করে তা নিশ্চিত করে) এবং "সম্পাদনা" প্রোগ্রামগতভাবে মনে হয় যে প্রশ্নটি কী প্রথম জায়গায় পরামর্শ চান।
ট্রিপলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.