ক্রন্টব জব তৈরি করতে, সম্পাদনা করতে এবং মুছতে পিএইচপি ব্যবহার করবেন?


116

ক্রন্টব জব তৈরি করতে, সম্পাদনা করতে এবং মুছতে পিএইচপি ব্যবহার করা কি সম্ভব?

আমি জানি যে কিভাবে অ্যাপাচি ব্যবহারকারীর বর্তমান ক্রন্টব্যাব কাজের তালিকা করতে হবে:

$output = shell_exec('crontab -l');
echo $output;

তবে পিএইচপি দিয়ে ক্রোন জব কীভাবে যুক্ত করবেন? 'crontab -e' কেবল একটি পাঠ্য সম্পাদক খুলবে এবং ফাইল সংরক্ষণের আগে আপনাকে ম্যানুয়ালি এন্ট্রি সম্পাদনা করতে হবে।

এবং পিএইচপি দিয়ে ক্রোন জব মুছবেন কীভাবে? আবার আপনাকে ম্যানুয়ালি 'ক্রোনটাব-ই' দ্বারা এটি করতে হবে।

এর মতো কাজের স্ট্রিং সহ:

$job = '0 */2 * * * /usr/bin/php5 /home/user1/work.php';

কীভাবে আমি পিএইচপি দিয়ে ক্রন্টব জব তালিকায় যুক্ত করব?



14
(ইঙ্গিত) ক্রোন্টাব কেবল একটি ফাইল
গর্ডন

1
@ গর্ডন, ধন্যবাদ আমি জানি যে সমস্ত কিছুই একটি ফাইল তবে তারা কি ক্রসট্যাব কাজগুলি বিভিন্ন ডিস্ট্রো জুড়ে একই পথে সংরক্ষণ করছে? এছাড়াও এ্যাচএইচএ-র ডেটা যেমন অ্যাপাচি ব্যবহারকারীর পাওয়া এবং মূলের সুবিধাগুলি থাকা দরকার?
datasn.io

আমি পথটি ডিস্ট্রোস জুড়ে পরিবর্তিত হয়েছে কিনা তা নিশ্চিত নই, তবে আপনি আপনার কোডটিতে পাথটিকে একটি কনফিগারযোগ্য মান হিসাবে তৈরি করতে এবং রানটাইম সময়ে সেট করার জন্য আপনি ভাল করছেন। ব্যবহারকারী এবং অনুমতিগুলির ক্ষেত্রে: প্রত্যেক ব্যবহারকারীর একটি ক্রন্টব থাকতে পারে যা সেই ব্যবহারকারীর জন্য নির্ধারিত অধিকারের সাথে কাজ চালায়, সুতরাং এটি আপনার সিস্টেম সেটআপের জন্য স্বতন্ত্র।
গর্ডন

আরো দেখুন stackoverflow.com/q/3186471/632951
Pacerier

উত্তর:


133

crontab কমান্ড ব্যবহার

usage:  crontab [-u user] file
        crontab [-u user] [ -e | -l | -r ]
                (default operation is replace, per 1003.2)
        -e      (edit user's crontab)
        -l      (list user's crontab)
        -r      (delete user's crontab)
        -i      (prompt before deleting user's crontab)

সুতরাং,

$output = shell_exec('crontab -l');
file_put_contents('/tmp/crontab.txt', $output.'* * * * * NEW_CRON'.PHP_EOL);
echo exec('crontab /tmp/crontab.txt');

উপরেরগুলি তৈরি এবং সম্পাদনা / সংযোজন উভয় ক্ষেত্রেই ব্যবহার করা যেতে পারে তবে ব্যবহারকারী পর্যাপ্ত ফাইল লেখার অনুমতি পান।

কাজগুলি মুছতে:

echo exec('crontab -r');

এছাড়াও, খেয়াল করুন যে অ্যাপাচি একটি নির্দিষ্ট ব্যবহারকারী হিসাবে চলমান এবং এটি সাধারণত মূল নয়, যার অর্থ ক্র্যাঞ্চ জব কেবল অ্যাপাচি ব্যবহারকারীর জন্য পরিবর্তন করা যেতে পারে যদি না অ্যাপাচি ব্যবহারকারীর সুযোগ না দেওয়া হয় crontab -u


4
'Crontab -r' ব্যবহারকারীর সমস্ত কাজ মুছে ফেলবে না? ব্যবহারকারীর ক্রোনট্যাবগুলিতে কাজের নির্দিষ্ট লাইনটি মুছার কোনও উপায় আছে কি? লোড করা, অনুসন্ধান করা এবং তারপরে পাওয়া লাইনটি মুছে ফেলা একমাত্র উপায় বলে মনে হয়।
datasn.io

3
আপনি একটি অস্থায়ী ফাইল লেখার পরিবর্তে পাইপগুলি ব্যবহার করতে পারেন
রিয়েলমফু

7
দুর্দান্ত সমাধান তবে shell_exec('crontab -l')কেবল শেষ লাইনে ফিরে আসবে। আমি ব্যবহৃত exec('crontab -l', $output)। তারপরে $ আউটপুট অ্যারেটিকে স্ট্রিংয়ে আচ্ছাদিত করুন (আঠালো হিসাবে \ n দিয়ে)।
ডেভিড ফেয়ারব্যাঙ্কস

1
@Rahul যদি সার্ভার প্রদানকারীর মত শেল কমান্ড প্রদান না system(), passthru(), shell_exec()এবং exec(), কন্ট্রোল প্যানেল যে এই ধরনের cPanel অথবা Plesk যেমন হোস্টিং, দিয়ে আসে ব্যবহার করার চেষ্টা করুন।
র‌্যাপটার

3
এটি প্রতিবার একটি ফাইলে একই কাজ যুক্ত করা চালিয়ে যাবে। (চেক করা) মেলানো কাজগুলি মুছে ফেলার আগে কোনও নতুন লেখার কোনও উপায় আছে কি?
আরটি

20

ব্যক্তিগত এবং স্বতন্ত্র কাজের জন্য ক্রোন ফাইল পরিচালনা করতে আমরা সম্প্রতি একটি মিনি প্রকল্প (পিএইচপি> = 5.3) প্রস্তুত করেছি। এই সরঞ্জামটি ক্রোন ফাইলগুলি সংযুক্ত করে এবং পরিচালনা করে যাতে আপনি সেগুলি ব্যবহার করতে পারেন, উদাহরণস্বরূপ প্রতিটি প্রকল্পের জন্য। ইউনিট পরীক্ষা উপলব্ধ :-)

কমান্ড লাইন থেকে নমুনা:

bin/cronman --enable /var/www/myproject/.cronfile --user www-data

এপিআই থেকে নমুনা:

use php\manager\crontab\CrontabManager;

$crontab = new CrontabManager();
$crontab->enableOrUpdate('/tmp/my/crontab.txt');
$crontab->save();

এপিআই থেকে স্বতন্ত্র কাজ পরিচালনা করা:

use php\manager\crontab\CrontabManager;

$crontab = new CrontabManager();
$job = $crontab->newJob();
$job->on('* * * * *');
$job->onMinute('20-30')->doJob("echo foo");
$crontab->add($job);
$job->onMinute('35-40')->doJob("echo bar");
$crontab->add($job);
$crontab->save();

গিথুব: পিএইচপি-ক্রন্টব-ম্যানেজার


খুশী হলাম। এটি অবশ্যই কাজে আসবে ... ধরে নিবেন এটি আসলে কাজ করে :)
বড়াকা

@ পেসার এই প্রকল্পটি মারা গেছে বলে মনে হচ্ছে এবং এর কিছু সমস্যা রয়েছে। ইজালিস / ক্রন্টব চেষ্টা করুন যা আরও সক্রিয়।
জেফ পেকেট

10

একটি ক্রোনজব পরীক্ষা করুন

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;
}

একটি ক্রন্টব সরান

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

উদাহরণ

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

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

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

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

ফাংশন append_cronjob আমার জন্য কাজ করে না। আমি আউটপুট পেয়েছি '-' এর অস্তিত্ব নেই: অ্যারে ([0] => '-' বিদ্যমান নেই [[1] => ব্যবহার: ক্রন্টব ফাইল [2] => ক্রন্টাব [-e | -l | -r] [3] => -e (ব্যবহারকারীর ক্রোনটব সম্পাদনা করুন) [4] =>-এল (ব্যবহারকারীর
ক্রোনটব তালিকাবদ্ধ করুন

এক্সিকিউট ('প্রতিধ্বনি -e " crontab -l\ n'। $ কমান্ড। '" | crontab -', $ আউটপুট); এটা কি ঠিক. আমি www-ডেটা "-" এর জন্য কোনও ক্রন্টব পাচ্ছি না ":": ক্রন্টব ফাইলটিতে খারাপ মিনিটের ত্রুটি, ইনস্টল করতে পারছে না।
রাহুল তাইওয়াল

ক্রন্টব লাইন ব্রেক (নিউলাইনস) সহ চাকরি সীমাবদ্ধ করে। প্রতিটি কাজ একটি লাইন দখল করে। সুতরাং, যদি ক্রোনটাব কোনও লাইনের প্রথম কলামে পূর্ণসংখ্যা ব্যতীত অন্য কিছু দেখতে পায়, তবে এটি "খারাপ মিনিট" ত্রুটি ছুঁড়ে দেয়, যেহেতু মিনিটের যুক্তিটি প্রথম ক্রোনটব মুখোমুখি হয়। এটি পরীক্ষা করুন dugv.com/2006/12/…
রাফাশী

ধন্যবাদ ... আমি কীভাবে আপনার প্রকল্পটি ব্যবহার করে ক্রোন _ জেড ব্যবহার করতে পারি ??
সালেম আহমেদ


5

আমি নীচে সমাধান চেষ্টা করেছিলাম

class Crontab {

// In this class, array instead of string would be the standard input / output format.

// Legacy way to add a job:
// $output = shell_exec('(crontab -l; echo "'.$job.'") | crontab -');

static private function stringToArray($jobs = '') {
    $array = explode("\r\n", trim($jobs)); // trim() gets rid of the last \r\n
    foreach ($array as $key => $item) {
        if ($item == '') {
            unset($array[$key]);
        }
    }
    return $array;
}

static private function arrayToString($jobs = array()) {
    $string = implode("\r\n", $jobs);
    return $string;
}

static public function getJobs() {
    $output = shell_exec('crontab -l');
    return self::stringToArray($output);
}

static public function saveJobs($jobs = array()) {
    $output = shell_exec('echo "'.self::arrayToString($jobs).'" | crontab -');
    return $output; 
}

static public function doesJobExist($job = '') {
    $jobs = self::getJobs();
    if (in_array($job, $jobs)) {
        return true;
    } else {
        return false;
    }
}

static public function addJob($job = '') {
    if (self::doesJobExist($job)) {
        return false;
    } else {
        $jobs = self::getJobs();
        $jobs[] = $job;
        return self::saveJobs($jobs);
    }
}

static public function removeJob($job = '') {
    if (self::doesJobExist($job)) {
        $jobs = self::getJobs();
        unset($jobs[array_search($job, $jobs)]);
        return self::saveJobs($jobs);
    } else {
        return false;
    }
}

}

এতে ক্রেডিট: ক্রোনটব ক্লাস ক্রোন জবস যুক্ত, সম্পাদনা এবং সরানোর জন্য


4

আপনি EDITORপরিবেশের পরিবর্তনশীলটিকে edএমন কোনও কিছু দিয়ে ওভাররাইড করার চেষ্টা করতে পারেন যা স্ট্যান্ডার্ড ইনপুট থেকে সম্পাদনা আদেশের ক্রম নিতে পারে।


3

আপনি যেখানে আপনার ক্রোনটব সংরক্ষণ করবেন তা নির্ভর করে:

shell_exec('echo "'. $job .'" >> crontab');

3

আপনি আপনার ফাইলটি /etc/cron.d/ এ ক্রোন ফর্ম্যাটে রাখতে পারেন। ফাইলনামে কিছু অনন্য উপসর্গ যুক্ত করুন স্ক্রিপ্ট-নির্দিষ্ট ক্রোন জবগুলি তালিকাভুক্ত করতে অনন্য উপসর্গের সাথে ফাইলগুলির তালিকা সহ কেবল কাজ করুন। আপনি যখন কাজটি অক্ষম করতে চান তখন ফাইলটি মুছুন।


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

3

ভাল ...
একটি নির্দিষ্ট ক্রোন জব (পরীক্ষিত) মুছে ফেলতে এটি চেষ্টা করুন।

<?php $output = shell_exec('crontab -l'); ?>
<?php $cron_file = "/tmp/crontab.txt"; ?>

<!-- Execute script when form is submitted -->
<?php if(isset($_POST['add_cron'])) { ?>

<!-- Add new cron job -->
<?php if(!empty($_POST['add_cron'])) { ?>
<?php file_put_contents($cron_file, $output.$_POST['add_cron'].PHP_EOL); ?>
<?php } ?>

<!-- Remove cron job -->
<?php if(!empty($_POST['remove_cron'])) { ?>
<?php $remove_cron = str_replace($_POST['remove_cron']."\n", "", $output); ?>
<?php file_put_contents($cron_file, $remove_cron.PHP_EOL); ?>
<?php } ?>

<!-- Remove all cron jobs -->
<?php if(isset($_POST['remove_all_cron'])) { ?>
<?php echo exec("crontab -r"); ?>
<?php } else { ?>
<?php echo exec("crontab $cron_file"); ?>
<?php } ?>

<!-- Reload page to get updated cron jobs -->
<?php $uri = $_SERVER['REQUEST_URI']; ?>
<?php header("Location: $uri"); ?>
<?php exit; ?>
<?php } ?>

<b>Current Cron Jobs:</b><br>
<?php echo nl2br($output); ?>

<h2>Add or Remove Cron Job</h2>
<form method="post" action="<?php $_SERVER['REQUEST_URI']; ?>">
<b>Add New Cron Job:</b><br>
<input type="text" name="add_cron" size="100" placeholder="e.g.: * * * * * /usr/local/bin/php -q /home/username/public_html/my_cron.php"><br>
<b>Remove Cron Job:</b><br>
<input type="text" name="remove_cron" size="100" placeholder="e.g.: * * * * * /usr/local/bin/php -q /home/username/public_html/my_cron.php"><br>
<input type="checkbox" name="remove_all_cron" value="1"> Remove all cron jobs?<br>
<input type="submit"><br>
</form>

exit;পরে যোগ করতে ভুলবেন না header('Location: ...');। এছাড়াও, এই ফর্মটি আসলে বেশ বিপজ্জনক, কারণ এটি সার্ভারটিকে "ধ্বংস" করতে ক্রোন জব যুক্ত করতে পারে।
র‌্যাপটার

1
নতুনদের জন্য দ্রষ্টব্য: আমরা পিএইচপি ট্যাগগুলিতে পিএইচপি এর প্রতিটি লাইন প্রকৃতপক্ষে গুটিয়ে রাখি না। পিএইচপি এর শুরুতে একটি এবং বিকল্প হিসাবে শেষে পর্যাপ্ত হবে।
নির্মাতা

0

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

এই, দেখুন নিম্নলিখিতরূপে crontab পরিবর্তন -e ছাড়া নিম্নলিখিতরূপে crontab পরিবর্তন আরও তথ্যের জন্য।


কিছু লোক ভাগ করা হোস্টে থাকতে পারে তাই এটি মোটেও কাজ না করে।
TheRealChx101

-1

ক্রন্টাবের পরিবর্তে আপনি গুগলের অ্যাপ ইঞ্জিন টাস্ক সারিও ব্যবহার করতে পারেন । এটিতে একটি উদার বিনামূল্যে কোটা রয়েছে, দ্রুত, স্কেলযোগ্য, পরিবর্তনযোগ্য।


3
কেন সহজভাবে ক্রোনজব ব্যবহার করবেন না?
পেসারিয়ার

-1

এটির সহজ আপনি এটি করতে কার্ল করতে পারেন, সার্ভারে ইনস্টল করা কার্লটি নিশ্চিত করুন:

প্রতি মিনিটে ট্রিগার করার জন্য: * * * * * কার্ল - প্রয়োজনীয় পোস্ট ' https://glassdoor.com/admin/sendBdayNotifications '

        • *

    মিনিট ঘন্টা দিন মাসে সপ্তাহে

যাক আপনি এই বিজ্ঞপ্তিটি প্রতিদিন 2:15 pm প্রেরণ করতে চান বলে দিন আপনি নিজের API এর ভিত্তিতে পোস্ট / জিইটি পরিবর্তন করতে পারেন:

15 14 * * * কার্ল - আপনার পোস্টের url 'পোস্ট করুন'

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