Cronjobs

Clemens

New Member
Hallo zusammen,

ich habe ein kleines Problem und eine kleine Lösung:

Es geht um die Cronjobs, die man mit dem ISPConfig auf bequeme Art und Weise eintragen kann. Ich brauche Jobs, die alle fünf Minuten oder alle zehn Minuten laufen. Das sind meistens Kontrolltools, die Flags abfragen, um ggf. etwas anzustoßen.

Nachdem ich im ISPConfig mehrere Jobs angelegt habe, bemerkte ich
1. dass sich Home-Verzeichnis des Users (also im /var/www/webXX) eine Menge, zumeiste leere Dateien befanden.
2. Dabei stellte ich fest, dass die Cronjobs nicht alle 5 bzw. 10 Minuten liefen, sondern jede Minute.

Also habe ich mal untersucht, ob ich zweites Problem lösen lässt. In der Datenbank stand *,5 bzw. *,10 . Das ist ein Format, was im Cronjob nicht verarbeitet werden kann. Vermutlich habe ich so die Daten angegeben, also "all" und "5" bzw. "all" und "10". Gedacht war meine Eingabe als alle 5 Minuten bzw. alle 10 Minuten. In der Dokumentation habe ich keinerlei Hinweise zu den Cronjobs diesbezüglich gefunden. Also bin ich mal durch die Scripte von ISPConfig gegangen und folgende Datei gefunden:

/root/ispconfig/scripts/lib/classes/ispconfig_cron.lib.php

VORSICHT: Dort hat nur jemand etwas zu suchen, der weiß was er tut. Ich mag mich zwar mit Linux und Debian noch nicht so gut auskennen. Aber mit PHP schon, also rein in den Quelltext. Und siehe da, das Problem war schnell gefunden:

Die folgende Zeile hat genau 2 Tücken:
if(strpos($user_cron['cron_minutes'], '*') === true) $user_cron['cron_minutes'] = '*';
1. Tücke. das "=== true" funktioniert in einigen PHP-Versionen nicht so wie erwartet. In "crontab -u webxx_x -e" fand ich nämlich überall *,5 bzw. *,10 an der ersten Stelle. Das installierte ISP-PHP hat es bei mir also nicht richtig erkannt, denn wenn ein * vorkommt, soll die Variable auf * setzen. Doch das ist mir nicht genug, ich will aus dem *,5 ein */5 machen. Also habe ich diese eine Zeile in drei Zeilen umgewandelt:

if(strpos($user_cron['cron_minutes'], '*,') !== false) {
$user_cron['cron_minutes'] = str_replace(',','/',$user_cron['cron_minutes']);
}
Also statt === true sollte man auch !== false setzen. Und dann ersetzt man, sofern *, vorkommt, das Komma durch einen Slash. That's all.
Theoretisch sollte man auch das Feld für Stunde, Tage und Monate entsprechend ändern. Wer sich in PHP auskennt, kann das ja bei sich tun. Ich bin mir sicher, dass dieses Problem in der nächsten Version schon behoben sein wird.


Doch für das Problem Nummer 1 habe ich keine Lösung. Normalerweise würde ich ein Script laufen lassen, welches regelmäßig die leeren Dateien löscht, doch obwohl die leeren Dateien den User des Webs haben, hat mein PHP-Script nicht die Befugnis auf diese zuzugreifen. Kennt jemand eine elegante Lösung, vielleicht sogar eine, um diese leere Dateien sogar wegzulassen?

Gruß
 

Till

Administrator
zu 1)

Du musst die Ausgabe von Scripten die per cron aufgerufen werden immer nach /dev/null schicken. das ist beim Cron immer so und nicht ISPConfig spezifisch. Aldo:

/usr/local/bin/meinscript.sh &> /dev/null
 

Clemens

New Member
Hallo Till,

die Ausgabe meiner Crons werden immer nach "&> /dev/null" geschickt, also in den Papierkorb. Daran liegt es nicht. Es muss an etwas anderem liegen. Ich rufe die Seiten mit wget auf und nicht mit PHP direkt. Das hat den Grund in der Pfad-Konstruktionen in den Scripten, die einen Browser erwarten. Aber daran kann es nicht liegen, oder doch?

Gruß
 

Till

Administrator
Je nach dem, welches Tool Du aufrufst musst Du noch bestimmte Kommandozeilenparameter angeben. Ein typisches Beispiel dafür ist wget, ich glaube dort musst Du zusätzlich -q angeben, damit es keine leere Datei anlegt.
 

Clemens

New Member
Fast, -q ist es nicht. Ich habe einige Parameter probiert und herausgefunden, dass die Lösung in Ausgabe mit -O liegt. Also:

wget URL -O &> /dev/null

Dieser Thread kann also als gelöst betrachtet werden.

Gruß
 

Werbung

Top