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

Lesezeit: 6 Minuten

Ist es möglich, mit PHP Crontab-Jobs zu erstellen, zu bearbeiten und zu löschen?

Ich weiß, wie man die aktuellen Crontab-Jobs des Apache-Benutzers auflistet:

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

Aber wie fügt man einen Cron-Job mit PHP hinzu? ‘crontab -e’ würde nur einen Texteditor öffnen und Sie müssen die Einträge manuell bearbeiten, bevor Sie die Datei speichern.

Und wie löscht man einen Cronjob mit PHP? Auch hier müssen Sie dies manuell mit ‘crontab -e’ tun.

Mit einem Job-String wie diesem:

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

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

  • mögliches Duplikat von Cron-Jobs mit PHP und einigen anderen

    – Gordon

    12. Dezember 2010 um 9:42 Uhr


  • (Hinweis) die crontab ist nur a Datei

    – Gordon

    12. Dezember 2010 um 9:46 Uhr

  • @ Gordon, danke. Ich weiß, dass alles eine Datei ist, aber speichern sie Crontab-Jobs auf demselben Pfad über verschiedene Distributionen hinweg? Außerdem müsste es den Benutzer von Apache wie www-data erhalten und die Privilegien von root haben?

    – datasn.io

    12. Dezember 2010 um 11:09 Uhr


  • Ich bin mir nicht sicher, ob sich der Pfad zwischen Distributionen ändert, aber Sie tun gut daran, den Pfad zu einem konfigurierbaren Wert in Ihrem Code zu machen und ihn dann zur Laufzeit festzulegen. Was den Benutzer und die Berechtigungen betrifft: Jeder Benutzer kann eine Crontab haben, die Jobs mit den Rechten ausführt, die diesem Benutzer zugewiesen sind, also ist dies individuell für Ihr System-Setup.

    – Gordon

    12. Dezember 2010 um 12:13 Uhr

  • Siehe auch stackoverflow.com/q/3186471/632951

    – Schrittmacher

    3. Februar 2015 um 16:28 Uhr

Crontab Jobs mit PHP erstellen bearbeiten und loschen
ajreal

crontab-Befehlsverwendung

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)

Damit,

$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 für beide verwendet werden erstellen und bearbeiten/anhängen vorausgesetzt, der Benutzer verfügt über die entsprechende Dateischreibberechtigung.

Jobs löschen:

echo exec('crontab -r');

Beachten Sie auch, dass Apache unter einem bestimmten Benutzer ausgeführt wird und dies normalerweise nicht root ist, was bedeutet, dass die Cron-Jobs nur für den Apache-Benutzer geändert werden können, sofern nicht angegeben crontab -u Privileg für den Apache-Benutzer.

  • Würde ‘crontab -r’ nicht alle Jobs des Benutzers löschen? Gibt es eine Möglichkeit, eine bestimmte Jobzeile in den Crontabs des Benutzers zu löschen? Laden, suchen und dann die gefundene Zeile löschen scheint der einzige Weg zu sein.

    – datasn.io

    12. Dezember 2010 um 11:26 Uhr

  • Sie können Pipes verwenden, anstatt eine temporäre Datei zu schreiben

    – reichfoo

    3. Februar 2012 um 8:34 Uhr

  • Schöne Lösung aber shell_exec('crontab -l') gibt nur die letzte Zeile zurück. ich benutzte exec('crontab -l', $output). Implodieren Sie dann das $output-Array in einen String (mit \n als Kleber).

    – David Fairbanks

    23. Dezember 2012 um 1:35 Uhr

  • @Rahul, wenn Serveranbieter keine Shell-Befehle wie bereitgestellt haben system(), passthru() , shell_exec() und exec()versuchen Sie, das mit dem Hosting gelieferte Control Panel zu verwenden, z. B. cPanel oder Plesk.

    – Raubvogel

    10. Juli 2014 um 3:15 Uhr

  • Dadurch wird jedes Mal derselbe Job in einer Datei angehängt. (markiert) Gibt es eine Möglichkeit, zuerst die übereinstimmenden Jobs zu entfernen und dann einen neuen zu schreiben?

    – RT

    17. Dezember 2014 um 8:03 Uhr

Crontab Jobs mit PHP erstellen bearbeiten und loschen
Chris Suszyński

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

Beispiel aus der Befehlszeile:

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

Beispiel von der API:

use php\manager\crontab\CrontabManager;

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

Verwalten einzelner Aufgaben von der API:

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

  • Hübsch. Das wird sich sicherlich als nützlich erweisen … vorausgesetzt, es funktioniert tatsächlich 🙂

    – Barak

    19. April 2012 um 6:11 Uhr

  • @Pacerier Dieses Projekt scheint tot zu sein und hat einige Probleme. Versuchen yzalis/crontab was aktiver ist.

    – Jeff Puckett

    10. November 2016 um 21:07 Uhr

Überprüfen Sie einen Cronjob

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

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

Crontab entfernen

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

  • Funktion append_cronjob funktioniert bei mir nicht. Ich bekomme die Ausgabe ‘-‘ existiert nicht: Array ( [0] => ‘-‘ existiert nicht. [1] => Verwendung: crontab-Datei [2] => Crontab [ -e | -l | -r ] [3] => -e (Crontab des Benutzers bearbeiten) [4] => -l (Crontab des Benutzers auflisten) [5] => -r (crontab des Benutzers löschen) )

    – Benutzer1307016

    5. Januar 2015 um 12:42 Uhr


  • exec(‘echo -e “crontab -l\n’.$command.'” | crontab -‘, $output); ist es richtig. Ich erhalte kein crontab für www-data “-“:0: schlimme Minutenfehler in crontab-Datei, kann nicht installiert werden.

    – Rahul Tailwal

    31. Januar 2015 um 4:52 Uhr

  • Crontab grenzt Jobs mit Zeilenumbrüchen (newlines) ab. Jeder Job belegt eine Zeile. Wenn crontab also in der ersten Spalte einer Zeile etwas anderes als eine ganze Zahl sieht, wird der Fehler „schlechte Minute“ ausgegeben, da das minute-Argument das erste ist, auf das crontab stößt. sieh dir das an dougv.com/2006/12/…

    – RafaSashi

    31. Januar 2015 um 7:39 Uhr

  • danke … wie kann ich cron_TZ mit Ihrem Projekt verwenden?

    – Salem Ahmed

    9. Mai 2017 um 6:01 Uhr

Dies sollte es tun

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

Ich habe die folgende Lösung 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;
    }
}

}

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

1646886247 645 Crontab Jobs mit PHP erstellen bearbeiten und loschen
Alnitak

Sie könnten versuchen, die zu überschreiben EDITOR Umgebungsvariable mit etwas wie ed die eine Folge von Bearbeitungsbefehlen über die Standardeingabe annehmen kann.

1646886248 628 Crontab Jobs mit PHP erstellen bearbeiten und loschen
diedom

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

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

986140cookie-checkCrontab-Jobs mit PHP erstellen, bearbeiten und löschen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy