Crontab नौकरियों को बनाने, संपादित करने और हटाने के लिए PHP का उपयोग करें?


116

क्या Crontab नौकरियों को बनाने, संपादित करने और हटाने के लिए PHP का उपयोग करना संभव है?

मुझे पता है कि अपाचे उपयोगकर्ता की वर्तमान कोंट्राब नौकरियों को कैसे सूचीबद्ध किया जाए:

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

लेकिन PHP के साथ क्रोन जॉब कैसे जोड़ें? 'crontab -e' सिर्फ एक टेक्स्ट एडिटर को खोलेगा और आपको फ़ाइल को सहेजने से पहले प्रविष्टियों को मैन्युअल रूप से एडिट करना होगा।

और PHP के साथ क्रॉन जॉब कैसे हटाएं? फिर आपको 'crontab -e' द्वारा इसे मैन्युअल रूप से करना होगा।

इस तरह एक नौकरी स्ट्रिंग के साथ:

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

मैं इसे PHP के साथ crontab नौकरियों की सूची में कैसे जोड़ूं?



14
(संकेत) क्रॉस्टैब सिर्फ एक फ़ाइल है
गॉर्डन

1
@ गॉर्डन, धन्यवाद। मुझे पता है कि सब कुछ एक फाइल है, लेकिन क्या वे विभिन्न डिस्ट्रोस में एक ही रास्ते पर क्रॉस्टैब जॉब जमा कर रहे हैं? साथ ही इसे Apache, जैसे www-data, और रूट के विशेषाधिकार प्राप्त करने की आवश्यकता होगी?
datasn.io

मुझे यकीन नहीं है कि यदि पथ डिस्ट्रोस में बदलता है, लेकिन आप पथ को अपने कोड में एक विन्यास योग्य मान बनाने के लिए अच्छा कर रहे हैं और इसे रनटाइम पर सेट करते हैं। उपयोगकर्ता और अनुमतियों के लिए: प्रत्येक उपयोगकर्ता के पास एक क्रेबट हो सकता है जो उस उपयोगकर्ता को दिए गए अधिकारों के साथ काम करता है, इसलिए यह आपके सिस्टम सेटअप के लिए अलग-अलग है।
गॉर्डन

जवाबों:


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' उपयोगकर्ता की सभी नौकरियों को नष्ट नहीं करेगा? क्या उपयोगकर्ता के crontabs में नौकरी की एक विशिष्ट रेखा को हटाने का कोई तरीका है? लोड हो रहा है, खोज और फिर पाया लाइन को हटाने का एकमात्र तरीका लगता है।
datasn.io

3
आप एक अस्थायी फ़ाइल लिखने के बजाय पाइप का उपयोग कर सकते हैं
realmfoo

7
अच्छा समाधान है, लेकिन shell_exec('crontab -l')केवल अंतिम पंक्ति वापस आ जाएगी। मैंने इस्तेमाल किया exec('crontab -l', $output)। फिर $ आउटपुट सरणी को एक स्ट्रिंग (गोंद के रूप में \ n) के साथ निहित करें।
डेविड फेयरबैंक्स

1
@Rahul यदि सर्वर प्रदाताओं की तरह खोल आदेशों प्रदान नहीं किया system(), passthru(), shell_exec()और exec(), नियंत्रण कक्ष है कि इस तरह cPanel या Plesk के रूप में की मेजबानी के साथ आता है का उपयोग करें।
रैप्टर

3
यह हर बार एक ही काम को एक फाइल में जोड़कर रखेगा। (चेक किया गया) क्या पहले मेल खाने वाली नौकरियों को हटाने का एक तरीका है, फिर एक नया लिखना?
आरटी

20

हमने हाल ही में निजी और व्यक्तिगत कार्यों के लिए क्रोन फ़ाइलों का प्रबंधन करने के लिए एक मिनी प्रोजेक्ट (PHP> = 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();

github: php-crontab-manager


अच्छा लगा। यह निश्चित रूप से काम में आएगा ... यह मानते हुए कि यह वास्तव में काम करता है :)
Baraka

@ स्पेसर यह परियोजना मृत लगती है और इसमें कुछ मुद्दे हैं। यज़लिस / क्रॉस्टैब की कोशिश करें जो अधिक सक्रिय है।
जेफ पकेट ने

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

एक crontab निकालें

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 मेरे लिए काम नहीं करता है। मुझे आउटपुट मिलता है '-' मौजूद नहीं है: Array ([0] => - 'मौजूद नहीं है। [1] => उपयोग: crontab फ़ाइल [2] => crontab [-e | -l | -r | -r | [३] => -ई (उपयोगकर्ता के क्रॉस्टैब को संपादित करें) [४] => -एल (सूची उपयोगकर्ता के क्रॉस्टैब) [५] => -आर (उपयोगकर्ता के
क्रेस्टैब को हटाएं

निष्पादन ('इको-ई " crontab -l\ n'। $ कमांड। '" | क्रॉस्टैब -', $ आउटपुट); क्या यह सही है। मुझे www-data के लिए कोई crontab नहीं मिल रहा है "-": 0: crontab फ़ाइल में खराब मिनट की त्रुटियां, इंस्टॉल नहीं हो सकती हैं।
राहुल तिलवाल

Crontab लाइन ब्रेक (newlines) के साथ नौकरियों का परिसीमन करती है। प्रत्येक कार्य एक पंक्ति में होता है। इसलिए, अगर crontab एक पंक्ति के पहले कॉलम में पूर्णांक के अलावा कुछ भी देखता है, तो यह "खराब मिनट" त्रुटि फेंकता है, क्योंकि मिनट तर्क पहले एक crontab मुठभेड़ों है। इसे देखें dougv.com/2006/12/…
RafaSashi

धन्यवाद ... कैसे मैं अपने प्रोजेक्ट का उपयोग करके cron_TZ का उपयोग कर सकता हूं ??
सलेम अहमद


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
शुरुआती के लिए ध्यान दें: हम वास्तव में PHP के हर लाइन को PHP टैग्स में नहीं लपेटते हैं। PHP की शुरुआत में एक और अंत में वैकल्पिक रूप से एक पर्याप्त होगा।
इकरन

0

सबसे आसान तरीका मापदंडों के रूप में मूल्यों में गुजर रहा है, एक bash स्क्रिप्ट निष्पादित करने के लिए shell_exec कमांड का उपयोग करना है। वहां से, आप किसी अन्य गैर-संवादात्मक स्क्रिप्ट में आप जैसे क्रॉस्टैब्स को हेरफेर कर सकते हैं, और यह भी सुनिश्चित कर सकते हैं कि आपके पास सूडो आदि का उपयोग करके सही अनुमति है।

इसे देखें, Crontab के बिना Crontab -e , अधिक जानकारी के लिए।


कुछ लोग एक साझा होस्ट में हो सकते हैं इसलिए यह बिल्कुल भी काम नहीं कर सकता है।
TheRealChx101

-1

Crontab के बजाय आप google के ऐप इंजन टास्क कतार का भी उपयोग कर सकते हैं । इसका एक उदार फ्री कोटा है, तेज, स्केलेबल, मोडिफायबल है।


3
बस क्रोनजोब का उपयोग क्यों नहीं किया जाता है?
पचेरियर

-1

इसका सरल आप ऐसा करने के लिए कर्ल कर सकते हैं, सुनिश्चित करें कि सर्वर पर स्थापित कर्ल:

हर मिनट को ट्रिगर करने के लिए: * * * * * कर्ल-ट्रेक POST ' https://glassdoor.com/admin/sendBdayNotification '

        • *

    मिनट घंटे दिन महीने सप्ताह

मान लें कि आप इस सूचना को 2:15 PM प्रतिदिन भेजना चाहते हैं, तो आप अपने API के आधार पर POST / GET को बदल सकते हैं:

15 14 * * * कर्ल - पोस्ट POST 'url का ur API'

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.