Crontab işlerini oluşturmak, düzenlemek ve silmek için PHP kullanılsın mı?


116

Crontab işleri oluşturmak, düzenlemek ve silmek için PHP kullanmak mümkün müdür?

Apache kullanıcısının şu anki crontab işlerini nasıl listeleyeceğimi biliyorum:

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

Fakat PHP ile bir cron işi nasıl eklenir? 'crontab -e' sadece bir metin düzenleyici açar ve dosyayı kaydetmeden önce girdileri manuel olarak düzenlemeniz gerekir.

PHP ile bir cron işi nasıl silinir? Yine bunu 'crontab -e' ile manuel olarak yapmanız gerekir.

Bunun gibi bir iş dizisiyle:

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

Bunu PHP ile crontab işleri listesine nasıl eklerim?



14
(ipucu) crontab sadece bir dosyadan
Gordon

1
@Gordon, teşekkürler. Her şeyin bir dosya olduğunu biliyorum, ancak crontab işlerini farklı dağıtımlarda aynı yolda mı depoluyorlar? Ayrıca, www-data gibi Apache kullanıcısını edinmesi ve root ayrıcalıklarına sahip olması gerekir mi?
datasn.io

Yolun dağıtımlar arasında değişip değişmediğinden emin değilim, ancak yolu kodunuzda yapılandırılabilir bir değer haline getirmek ve o zaman onu çalışma zamanında ayarlamak için iyi gidiyorsunuz. Kullanıcı ve izinlere gelince: her kullanıcı, işleri o kullanıcıya atanan haklarla çalıştıran bir crontab'a sahip olabilir, bu nedenle bu, sistem kurulumunuz için bireyseldir.
Gordon

Yanıtlar:


133

crontab komut kullanımı

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)

Yani,

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

Yukarıdakiler , kullanıcının yeterli dosya yazma iznine sahip olması koşuluyla hem oluşturma hem de düzenleme / ekleme için kullanılabilir .

İşleri silmek için:

echo exec('crontab -r');

Ayrıca, apache'nin belirli bir kullanıcı olarak çalıştığını ve bunun genellikle root olmadığını unutmayın; bu, cron işlerinin apache kullanıcısına crontab -uayrıcalık verilmediği sürece sadece apache kullanıcısı için değiştirilebileceği anlamına gelir .


4
'Crontab -r' kullanıcının tüm işlerini silmez mi? Kullanıcının crontab'larında belirli bir iş satırını silmenin herhangi bir yolu var mı? Bulunan satırı yüklemek, aramak ve sonra silmek tek yol gibi görünüyor.
datasn.io

3
Geçici bir dosya yazmak yerine boruları kullanabilirsiniz
realmfoo

7
Güzel çözüm, ancak shell_exec('crontab -l')yalnızca son satırı döndürür. Kullandım exec('crontab -l', $output). Sonra $ output dizisini bir dizgeye (yapıştırıcı \ n ile) yerleştiriniz.
David Fairbanks

1
@Rahul sunucu sağlayıcıları gibi kabuk komutlarını vermedi eğer system(), passthru(), shell_exec()ve exec()bu tür cPanel veya Plesk gibi barındırma ile gelir kontrol panelini kullanarak deneyin.
Raptor

3
bu, bir dosyaya her seferinde aynı işi eklemeye devam edecektir. (işaretlendi) önce eşleşen işleri kaldırıp ardından yeni bir tane yazmanın bir yolu var mı?
RT

20

Özel ve bireysel görevler için cron dosyalarını yönetmek için yakın zamanda bir mini proje (PHP> = 5.3) hazırladık. Bu araç, cron dosyalarını bağlar ve yönetir, böylece bunları örneğin proje başına kullanabilirsiniz. Birim Testleri mevcuttur :-)

Komut satırından örnek:

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

API'den örnek:

use php\manager\crontab\CrontabManager;

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

API'den bireysel görevleri yönetme:

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-yöneticisi


Güzel. Bu kesinlikle işe yarayacak ... gerçekten işe yaradığını varsayarak :)
Baraka

@Pacerier bu proje ölmüş görünüyor ve bazı sorunları var. Daha aktif olan yzalis / crontab'ı deneyin .
Jeff Puckett

10

Bir cronjob kontrol edin

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

Bir cronjob ekleyin

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

Bir crontab'ı kaldırma

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

Misal

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');

fonksiyon append_cronjob benim için çalışmıyor. '-' çıktısını alıyorum: Dizi ([0] => '-' mevcut değil. [1] => kullanım: crontab dosyası [2] => crontab [-e | -l | -r] [3] => -e (kullanıcının crontabını düzenle) [4] => -l (kullanıcının
crontabını listele

exec ('echo -e " crontab -l\ n'. $ komut. '" | crontab -', $ çıktı); doğru mu. Www-data "-": 0: crontab dosyasında kötü dakika hataları, yüklenemiyor.
Rahul Tailwal

Crontab, işleri satır sonlarıyla (yeni satırlar) sınırlar. Her iş bir satır kaplar. Bu nedenle, crontab bir satırın ilk sütununda tam sayı dışında bir şey görürse, dakika argümanı crontab'ın karşılaştığı ilk argümandan dolayı "kötü dakika" hatasını atar. bunu kontrol edin dougv.com/2006/12/…
RafaSashi

teşekkürler ... projenizi kullanarak cron_TZ'yi nasıl kullanabilirim ??
Salem Ahmed

5

Bu yapmalı

shell_exec("crontab -l | { cat; echo '*/1    *    *    *    *    command'; } |crontab -");

5

Aşağıdaki çözümü denedim

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

}

Krediler: Cron İşlerini Eklemek, Düzenlemek ve Kaldırmak için Crontab Sınıfı


4

Standart giriş yerine bir dizi düzenleme komutu alabilen bir EDITORşeyle ortam değişkenini geçersiz kılmayı deneyebilirsiniz ed.


3

Crontab'inizi nerede sakladığınıza bağlıdır:

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

3

Dosyanızı /etc/cron.d/ 'a cron formatında koyabilirsiniz. Dosya adına benzersiz bir önek ekleyin Komut dosyasına özgü cron işlerini listelemek için benzersiz bir öneki olan bir dosya listesiyle çalışın. İşi devre dışı bırakmak istediğinizde dosyayı silin.


Bu çözümü daha çok seviyorum çünkü tüm cron dosyasını değiştirmekten kaçınıyor ve büyük bir cron dosyasına belirli bir cron görevi eklemek ve kaldırmak zorunda kalmadan kaldırılması kolay.
Jovanni G

3

Güzel ...
Belirli bir cron işini (test edilmiş) kaldırmak için bunu deneyin.

<?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;Sonra eklemeyi unutmayın header('Location: ...');. Ayrıca, bu form sunucuyu "yok etmek" için cron işi ekleyebileceği için aslında oldukça tehlikelidir.
Raptor

1
Yeni başlayanlar için not: Aslında PHP'nin her satırını PHP etiketlerine sarmıyoruz. PHP'nin başında bir tane ve isteğe bağlı olarak sonunda bir tane yeterli olacaktır.
ekerner

0

En kolay yol, bir bash betiğini çalıştırmak için shell_exec komutunu kullanmak ve değerleri parametre olarak iletmektir. Oradan, etkileşimli olmayan diğer herhangi bir komut dosyasında yaptığınız gibi crontab'leri işleyebilir ve ayrıca sudo vb. Kullanarak doğru izinlere sahip olduğunuzdan emin olabilirsiniz.

Daha fazla bilgi için buna bakın, crontab -e içermeyen Crontab .


Bazı kişiler paylaşılan bir ana bilgisayarda olabilir, bu nedenle bu hiç çalışmayabilir.
TheRealChx101

-1

Crontab yerine Google'ın uygulama motoru görev sırasını da kullanabilirsiniz . Cömert bir ücretsiz kotası vardır, hızlıdır, ölçeklenebilir ve değiştirilebilir.


3
Neden sadece cronjob kullanmıyorsunuz?
Pacerier

-1

Çok basit Bunu yapmak için curl yapabilirsiniz, curl'nin sunucuda kurulu olduğundan emin olun:

her dakika tetiklemek için: * * * * * curl --request POST ' https://glassdoor.com/admin/sendBdayNotification '

        • *

    dakika saat gün hafta hafta

Bu bildirimi her gün 14:15 göndermek istediğinizi varsayalım. POST / GET'i API'nize göre değiştirebilirsiniz:

15 14 * * * curl --request POST 'url of ur API'

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.