Cronjobs durch Script erstellen?

eperdemer

Mitglied
Moinsen,

in der Suche und bei google habe ich leider nichts brauchbares gefunden also Poste ich mal mein anliegen.

Ich möchte gerne mit einem PHP-Script die Crontab beschreiben. Das heißt Jobs erstellen/ bearbeiten und löschen.

Kann mir einer Sagen wie ich das Realisieren kann?

cu
ePeRDeMeR
 
Die einfachste Lösung wäre, eine Art leeres Dokument über zB <img> in ein HTML-Dokument einzubinden, welches beim Aufruf alle möglichen Cronjobs ausliest und sie ausführt, sofern die letzte Ausführung ,länger als einen Zielintervall zurückliegt - Frei nach dem Muster
PHP:
$result = mysql_query("
    SELECT `cron_id`, `job_code`
    FROM `crons`
    WHERE `last_exec` < UNIX_TIMESTAMP() - `interval`;");

$ids = array();
while ($current = mysql_fetch($result)) {
    $ids[] = $current['cron_id'];
    eval(addslashes($current['job_code']));
}

mysql_query("
    UPDATE `crons`
    SET `last_exec` = UNIX_TIMESTAMP()
    WHERE `cron_id` IN (" . implode($ids) . ");");

Geht noch etwas zu optimieren und ist auch ansonsten nicht sehr zuverlässig, aber eventuell die günstigste Möglichkeit.
Weiterhin wäre ein einmaliger Scriptaufruf möglich, der nie endet (aber Vorsicht mit der maximalen Scriptlaufzeit und weiteren Faktoren) - Hier besteht aber die Möglichkeit eines Mehrfachaufrufs.
Das wären erstmal meine grundsätzlichen Ideen zur Cron-Emulierung ohne Daemon ;)
 
Hallo,
@maeTimmae
so wie ich das verstanden hab möchte er aber richtige Cronjobs anlegen, wie wenn man z.B. in Putty crontab -e eingibt.

@eperdemer
So einfach glaub ich wird das nicht werden, da PHP nicht die benötigten Rechte haben wird, schätz ich mal.

mfg
forsterm
 
Ohje, danke forsterm - Hast Recht...

Naja, selbst das ist mit dem richtigen Wissen und der Nutzung der [phpf]exec[/phpf] Funktionen keine große Sache. Habe leider gerade keine Zeit um es mir selbst mal anzutun...
 
@maeTimmae: die idee ist ja nicht schlecht.

mit exec() habe ich das versucht nur wird der Befehl nicht ausgeführt bzw. bekomme ich keine Rückgabe. Mussen dafür besondere Einstellungen vorgenommen werden?

cu
ePeRDeMeR
 
Die Frage ist, ob er "nur einfachen Webspace" oder einen V- oder Root-Server sein Eigen nennt. Bei V- bzw Root-Servern kann man dem PHP/WWW-Benutzer ja die Rechte geben, Cronjobs auszuführen. Bei einfachem Webspace hat der PHP/WWW-Benutzer eigentlich keine anderen Rechte,als Seiten zu Parsen -was i.d.R. auch gut so ist. Ich denke,Tools wie Plesk oder Confixx die soetwas auch erlauben sind eine gute Sache für Anfänger, gefährden jedoch einen Webserver erheblich - somit lieber ein Shellscript schreiben das "su" oder "sudo" aufruft und den gewünschten Befehl ausführt ...sofern das ein Root-Server ist ;)

LG
Andy
 
Ich habe einen Root-Server, mit Shellscripten kenne ich mich nicht so aus, kenne auch "su" und "sudo" nicht.

Auf dem Server leuft Linux und Confixx.

Wenn ich dem "wwwrun" Benutzer die nötigen Rechte gebe Cronjobs zu erstellen den könnte das ja jeder der einen Account auf den Server hat auch mit einem Script machen?

Gibt es eine möglichkeit diese Rechte auf einen Webaccount zu beschränken?

/* EDIT */
habe das mal mit folgendem Code getestet:
PHP:
$output = shell_exec('crontab -e');
echo "<pre>$output</pre>";

bekomme auch ein Ergebniss zurück nur schaut das aus wie Hieroglyphen, aber so weit ich erkennen kann ist es mit der Ausgabe bei Putty identisch.

Code:
[?1049h[?1h=[?12;25h[?12l[?25h[?25l"/tmp/crontab.XXXX6LrFUR" 0L, 0C~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               0,0-1All[?12l[?25h[?1l>[?1049lVim: Error reading input, exiting...
Vim: Finished.
[?25l[?12l[?25h


cu
ePeRDeMeR
 
Zuletzt bearbeitet:
Gut ...ein Root-Server wirst Du für diese Aktion brauchen.
Ich hoffe, Du hast Dich vor Deinem Vorhaben schon mal mit Cronjobs beschäftigt - der Befehl "crontab -e" öffnet lediglich eine Jobdatei zum bearbeiten,und nicht zum direkten Einfügen durch stdin.
Was Du machen müsstest ist, dass Du mittels PHP eine Jobdatei erstellst oder änderst und diese auf Deinem Server im entsprechenden Verzeichnis unter Berücksichtigung von User:Gruppe speicherst. Mit "shell_exec()", "system()" oder "passthrough()" wirst Du also nicht weit kommen.

Um die Jobdatei dann auszulesen zum bearbeiten,müsstest Du sie dann einlesen bzw parsen,damit Du Uhrzeit, Häufigkeit, User und Befehle bearbeiten und erneut speichern kannst. Das Format der Jobdatei ist ein reines Textformat - Informationen zum Aufbau dieser erhälst Du ja über den Befehl "man crontab".

LG
Andy
 
@andy72: wenn ich das richtig verstehe brauche ich nur eine Datei erstellen mit z.b.

Code:
0,15,30,45 * * * * BEFEHL
0,15,30,45 * * * * BEFEHL
0,15,30,45 * * * * BEFEHL

und diese in /etc/cron.d abspeichern? Habe gesehen das da noch andere Cronjob Dateien liegen.

cu
ePeRDeMeR
 
Zurück