it-swarm.com.de

Benutzen PHP Crontab-Jobs erstellen, bearbeiten und löschen?

Kann man mit PHP Crontab-Jobs erstellen, bearbeiten und löschen?

Ich kann die aktuellen Crontab-Jobs des Apache-Benutzers auflisten:

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

Aber wie füge ich einen Cron-Job mit PHP hinzu? 'crontab -e' öffnet lediglich einen Texteditor und Sie müssen die Einträge vor dem Speichern der Datei manuell bearbeiten.

Und wie lösche ich einen Cron-Job mit PHP? Wieder müssen Sie dies manuell mit 'crontab -e' tun.

Mit einem Jobstring wie folgt:

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

Wie füge ich es mit PHP zur Crontab-Jobliste hinzu?

110
datasn.io

crontab Befehl Verwendung  

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)

So,

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

Das obige kann sowohl für Erstellen als auch Bearbeiten/Anhängen verwendet werden, sofern der Benutzer über die entsprechenden Schreibrechte für Dateien verfügt.

So löschen Sie Jobs:

echo exec('crontab -r');

Beachten Sie außerdem, dass Apache als bestimmter Benutzer ausgeführt wird und normalerweise nicht root ist. Dies bedeutet, dass Cron-Jobs nur für den Apache-Benutzer geändert werden können, sofern dem Apache-Benutzer keine crontab -u-Berechtigung erteilt wird.

127
ajreal

Wir haben kürzlich ein Mini-Projekt (PHP> = 5.3) vorbereitet, um die Cron-Dateien für private und individuelle Aufgaben zu verwalten. Dieses Tool verbindet und verwaltet die Cron-Dateien, sodass Sie sie beispielsweise pro Projekt verwenden können. Unit-Tests verfügbar :-)

Beispiel von der Kommandozeile:

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

Beispiel aus API:

use php\manager\crontab\CrontabManager;

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

Einzelne Aufgaben über die API verwalten:

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

20
cardil

Einen Cronjob prüfen

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

Einen Cronjob anhängen

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

Entfernen Sie eine Crontab

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

Beispiel

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

Das sollte es tun

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

Ich habe die Lösung unten ausprobiert

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

}

credits an: Crontab-Klasse zum Hinzufügen, Bearbeiten und Entfernen von Cron-Jobs

4
Sam T

Sie könnten versuchen, die Umgebungsvariable EDITOR mit etwas wie ed zu überschreiben, wodurch eine Reihe von Bearbeitungsbefehlen über die Standardeingabe genommen werden kann.

4
Alnitak

Nett...
Versuchen Sie dies, um einen bestimmten Cron-Job zu entfernen (getestet).

<?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>
4
Ajie Kurniyawan

Hängt davon ab, wo Sie Ihren Crontab speichern:

Shell_exec('echo "'. $job .'" >> crontab');
3
thedom

Sie können Ihre Datei im cron-Format unter /etc/cron.d/ ablegen. Fügen Sie dem Dateinamen ein eindeutiges Präfix hinzu Um skriptspezifische Cron-Jobs aufzulisten, arbeiten Sie einfach mit einer Liste von Dateien mit einem eindeutigen Präfix. Löschen Sie die Datei, wenn Sie den Job deaktivieren möchten.

3
Dmitry Kireev

Am einfachsten ist es, den Befehl Shell_exec zum Ausführen eines Bash-Skripts zu verwenden, wobei die Werte als Parameter übergeben werden. Von dort aus können Sie die Crontabs wie in jedem anderen nicht interaktiven Skript bearbeiten und außerdem sicherstellen, dass Sie die richtigen Berechtigungen haben, indem Sie Sudo usw. verwenden.

Sehen Sie dies, Crontab ohne Crontab -e , für weitere Informationen.

0
Codemwnci

Es ist einfach. Sie können es so einstellen, dass Curl auf dem Server installiert ist:

zum Auslösen jeder Minute: * * * * * curl --request POST ' https://glassdoor.com/admin/sendBdayNotification '

        • *

    minute Stunde Tag Monat Woche

Angenommen, Sie möchten diese Benachrichtigung täglich um 2:15 Uhr PM senden Sie können POST/GET basierend auf Ihrer API ändern:

15 14 * * * curl --request POST 'URL der ur API'

0
dinesh kandpal