Sicherheit bei CronJobs

fruchttiger

New Member
Hi,

zu meiner Schande muss ich gestehen, dass ich mich mit diesem Thema bisher nicht wirklich befasst habe. Ich habe auch leider keine wirklich hilfreichen Texte oder Dokumentationen gefunden die mir geholfen haben...

Es ist folgendes aufgetreten:
Ein CronJob eines Users ruft ein PHP-Script auf, der Cron wird stundenlang ausgeführt und treibt den Serverload in schwindelige Höhen bis ich ihn manuell kille. Dieser Cron läuft alle 5 Minuten, scheinbar willkürlich bleibt er dann irgendwann solange bestehen und endet nicht. Ich könnte jetzt natürlich dieses Script genau unter die Lupe nehmen und schauen warum es Probleme gibt, aber das ist nicht das was ich möchte, sondern ich will, dass auch wenn unschöne Scripts aufgerufen werden der Server damit umgehen kann und ggf. den CronJob einfach beendet.

Das erste was ich überprüft habe war die zuständige php.ini (cli) mit einer max_execution_time von 30 Sekunden... wieso in aller Welt bricht das Script denn trotzdem nicht ab?

Welche Einstellungsmöglichkeiten gibt es um Cron vernünftig gegen so einen Überlauf abzusichern? Gibt es eine art execution_time für Cron?

Viele Grüße
 
Hallo fruchttiger,

interessante Frage, das würde mich auch interessieren.
Erst vor kurzem habe ich ein wenig über PHP CLI gelesen. So wie ich den Erklärungen entnehmen konnte unterliegen PHP Scripts die via Command Line aufgerufen werden keiner max_execution_time und laufen ewig. Laut PHP.net muß man wohl den Parameter -c mit Pfad/Dateiname zu einer separaten PHP.ini angeben oder mit dem Parameter -d einen ini-Wert festlegen, z.B.:
Code:
php -f -d max_execution_time=30 /pfad/zum/php_script

Diese Informationen sind von PHP.net, also lohnt sich vielleicht ein Blick. (Direkt im oberen Bereich der Seite, Abschnitt Overridden php.ini directives, steht das über die max_execution_time.)
Angabe ohne Gewähr, da ich vielleicht vollkommen falsch liege. ;)
 
Hey!

Vielen Dank für die Auskunft, das hat schon mal sehr geholfen!

Da die User nun aber explizit den Wert von execution_time oder eine php.ini angeben müssten, was ja aber niemand macht, habe ich folgendes getan:

Code:
# mv /usr/bin/php5 /usr/bin/php5-cli
# chmod 0754 /usr/bin/php5-cli
# ln -s /usr/bin/php5-cgi /usr/bin/php5

Jetzt werden alle PHP-Scripts die via CronJob mittels php5 angestoßen werden an die php5-cgi weitergeleitet und nicht mehr über CLI verarbeitet.

Demnach wird nun auch die php.ini vollständig benutzt und es sollte nichts mehr überschrieben werden.

Es wäre zwar genial wenn jeder User der ein PHP-Script über Cron ausführt automatisch seine eigene php.ini zur Grundlage nehmen würde, aber das wird wohl nicht so einfach zu machen sein... oder hat da jemand eine Idee? ;)

Mir ist zudem auch nicht so klar was für Einstellungsmöglichkeiten Cron eigentlich mitbringt. Ich habe mal gelesen, man könne eine config Datei anlegen die dann von Cron benutzt wird, aber ich habe dazu herzlich wenig Infos gefunden.

Viele Grüße
Robin
 
Hallo Robin :)

fruchttiger said:
Es wäre zwar genial wenn jeder User der ein PHP-Script über Cron ausführt automatisch seine eigene php.ini zur Grundlage nehmen würde, aber das wird wohl nicht so einfach zu machen sein... oder hat da jemand eine Idee? ;)


Naja, eine Idee wäre vielleicht, das die PHP Scripts nicht per Command Line, sondern "extern" mit wget oder lynx angestoßen werden. Dadurch verhalten sich die Scripts als wären sie vom Browser aufgerufen worden und unterliegen somit den Restriktionen php.ini.
 
Hi,
Welche Einstellungsmöglichkeiten gibt es um Cron vernünftig gegen so einen Überlauf abzusichern? Gibt es eine art execution_time für Cron?

Falls das ganze nicht auf PHP beschränkt sein soll, empfiehlt es sich, passende ulimits zu setzen.
 
Back
Top