cronjob soll sich selbst aufrufen
cronjob soll sich selbst aufrufen
am 06.07.2006 20:32:12 von Thomas Dartsch
Hallo,
und noch eine 'cronjob'-Frage hinterher:
Da einige Webserver mit engen max_execution und max_memory-Werten arbeiten,
muß ich meinen cronjob seine Gesamtarbeit in einzelnen Unterschritten
ausführen lassen, da er umfangreiche und zeitaufwendige Prozesse durchführt.
Kann ich a) per exec() den cron sich selbst ausführen lassen, damit dieser
"Unterprozess" wieder volle Ausführungsrechte laut "php.ini" hat?
Der Unterprozess soll also auch dann weiterlaufen, wenn sein "Vater" bereits
durch den Server beendet wurde. (z.B. zur ein time out)
Kann ich b) dem Unterprozess irgendwelche Parameter übergeben? (Die in bei
einem normalen Web-PHP-Script per GET-oder POST übergeben würde.)
Wenn das nicht möglich ist, muß ich wohl die Parameter vom "Vater" in eine
Datei schreiben, die dann der Unterprozess öffnet und nutzt. Oder hat jemand
eine bessere Lösung?
PS: Man kann das Ganze mit den Problemen von "mysqldumper" vergleichen. Dort
wird allerdings ein Perlscript für das "tickern" der gesamten Abarbeitung
genutzt. Ich möchte das mit PHP machen, da ich mich mit Perl leider
überhaupt nicht auskenne :-/
vielen Dank
t.d
Re: cronjob soll sich selbst aufrufen
am 06.07.2006 20:48:37 von Carsten Wiedmann
Thomas Dartsch schrieb:
> Da einige Webserver mit engen max_execution und max_memory-Werten
> arbeiten, muß ich meinen cronjob seine Gesamtarbeit in einzelnen
> Unterschritten ausführen lassen, da er umfangreiche und zeitaufwendige
> Prozesse durchführt.
Was interessiert ein Cronjob der ein Shellscript ausführt, welche
Einstellungen du in deinem Webserver hast?
Re: cronjob soll sich selbst aufrufen
am 06.07.2006 21:15:40 von Jurij Klauss
> Da einige Webserver mit engen max_execution und max_memory-Werten
> arbeiten,
> muß ich meinen cronjob seine Gesamtarbeit in einzelnen Unterschritten
> ausführen lassen, da er umfangreiche und zeitaufwendige Prozesse
> durchführt.
Am Ende deines Scriptes könnte es sich selbst aufrufen.
echo "bla"
if($_GET['durchgang'] == n) exit();
$durchgang = $_GET['durchgang'] +1
header("Location:
http://meinseite.de/dieses_scipt.php?durchgang=".$durchgang) ;
Cron Jobs sind zum zeitgesteuerten Aufruf da: Z.B.
http://meinseite.de/dieses_scipt.php jeden Tag um 23.00 Uhr aufrufen..
Grüße
Jurij
Re: cronjob soll sich selbst aufrufen
am 06.07.2006 22:03:08 von Thomas Dartsch
"Carsten Wiedmann" schrieb
> Was interessiert ein Cronjob der ein Shellscript ausführt, welche
> Einstellungen du in deinem Webserver hast?
Dann formuliere ich es anders:
Neben den Beschränkungen der php-Scripte, die über den Webservers ausgeführt
werden, unterliegen auch die cronjobs bestimmten memory- und
execution_time-Beschränkungen.
Re: cronjob soll sich selbst aufrufen
am 06.07.2006 22:15:25 von Thomas Dartsch
"Jurij Klauss" schrieb im Newsbeitrag
news:e8jnmt$j1o$1@murphy.mediascape.de...
> Am Ende deines Scriptes könnte es sich selbst aufrufen.
> ...
> header("Location:
> http://meinseite.de/dieses_scipt.php?durchgang=".$durchgang) ;
Was nur bei PHP-Scripten möglich ist, die per Webclient aufgerufen werden.
Das man dabei die funktion header() benutzen kann, ist mir bekannt.
Ich sprach aber vom selben Effekt bei cronjobs. Was so natürlich nicht geht.
> Cron Jobs sind zum zeitgesteuerten Aufruf da: Z.B.
> http://meinseite.de/dieses_scipt.php jeden Tag um 23.00 Uhr aufrufen..
Das ist mir sehr wohl bekannt.
Anders gesagt:
Ich möchte eine zeitgesteuerte Aufgabe starten, die sich anhand von
bestimmten Bedingungen n-Mal wiederholt aufruft, um so z.B. Prozesse
durchzuführen, die in einem Stück ausgeführt viel Speicher oder viel Zeit
benötigen würden.
Durch die Stückelung umgehe ich das und kann somit die Aufgabe zu einer
bestimmten Zeit wiederholt durchführen.
Analoges Beispiel wäre das PHP-Projekt mysqldumper, der durch diese
"Technik" in der Lage ist, auch große Datenbanken auf einem shared-Account
eines Hosters eine Komplettsicherung durchzuführen.
t.d
Re: cronjob soll sich selbst aufrufen
am 06.07.2006 22:31:43 von Carsten Wiedmann
Thomas Dartsch schrieb:
>
> "Carsten Wiedmann" schrieb
>
> > Was interessiert ein Cronjob der ein Shellscript ausführt, welche
> > Einstellungen du in deinem Webserver hast?
>
> Dann formuliere ich es anders:
>
> Neben den Beschränkungen der php-Scripte, die über den Webservers
> ausgeführt werden, unterliegen auch die cronjobs bestimmten memory- und
> execution_time-Beschränkungen.
Stimmt, manch Hoster wird den maximalen Speicher und Dauer die ein Prozess
laufen darf einschränken. Nur was hat dies, und wie Cronjobs funktionieren
mit PHP zu tun?
> Kann ich a) per exec() den cron sich selbst ausführen lassen, damit
> dieser "Unterprozess" wieder volle Ausführungsrechte laut "php.ini" hat?
Aber eine kleine Antwort:
Man kann mit keinem Befehl einen Cronjob direkt ausführen. Also auch nicht
über exec(). Du kannst nur die Crontab anpassen (neuen Job anlegen, einen
vorhandenen ändern oder löschen).
Aber bei "php.ini" und "max_execution und max_memory-Werten" noch zwei
Hinweise:
a) "max_execution_time" spielt auf der Konsole eh keine Rolle.
b) du kannst beim Cronjob zudem ja auch gleich eine "php.ini" mit den Werten
vorgeben, die dir vorschweben.
Gruß
Carsten
Re: cronjob soll sich selbst aufrufen
am 06.07.2006 23:08:02 von Thomas Dartsch
"Carsten Wiedmann" schrieb
> Stimmt, manch Hoster wird den maximalen Speicher und Dauer die ein Prozess
> laufen darf einschränken. Nur was hat dies, und wie Cronjobs funktionieren
> mit PHP zu tun?
Weil der cronjob ein PHP-Skript ausführt, das wiederum die angesprochenen
Beschränkungen sprengen (könnte).
nochmal anders gesagt:
Es soll ein cronjob eingerichtet werden, der z.B. einmal am Tag gestartet
wird.
Er startet ein php-Script, das auf dem Server liegt. Dieses PHP-Script soll
sich selbst wieder aufrufen, nachdem es bestimmte Funktionen durchgeführt
hat. Die durchgeführten Arbeiten sind aber nur ein gewisser Teil dessen, was
komplett durchgeführt werden soll.
Um aber Beschränkungen zu umgehen, die der Provider den per Konsole (oder
cronjob, was technisch dasselbe sein sollte) gestarteten Skripten auferlegt
hat, wird die Gesamtaufgabe gestückelt.
Dazu muß ich aber sicherstellen, das ich z.B. per exec() eine PHP-Datei
aufrufen kann (in dem Fall sich selbst) und dieser Prozess auch erhalten
bleibt, wenn der Vater aufgrund der o.g. Beschränkungen vom Server beendet
wurde.
Am Ende ergibt es einen "Baum", dessen Zweige per exec() aufgerufen werden
und die alle einen Teil der Gesamtaufgabe erledigen.
> Aber eine kleine Antwort:
> Man kann mit keinem Befehl einen Cronjob direkt ausführen. Also auch nicht
> über exec(). Du kannst nur die Crontab anpassen (neuen Job anlegen, einen
> vorhandenen ändern oder löschen).
Mi "cronjob" habe ich das PHP-Script gemeint, das zeitgesteuert ausgeführt
wird.
Möglicherweise habe ich hier zwei Begriffe nicht 100%ig korrekt genutzt.
Mir ist klar, was ein cronjob ist. Dieser läßt in meinem Fall ein PHP-Skript
ausfphren, das innerhalb seiner Routinen ein exec() enthalten könnte. (Wenn
denn damit meine Aufgabenstellung gelöst würde)
> a) "max_execution_time" spielt auf der Konsole eh keine Rolle.
Ich wollte damit lediglich die Beschränkungen umschreiben, mit denen ich zu
tun habe.
Beispiel eines Hosters zum Thema "cronjob":
" Das Script wird überwacht und bekommt max. folgende Resourcen zugewiesen:
120 Sekunden Laufzeit, 20 CPU-Sekunden, 15 geöffnete Dateien, 20MB RAM."
Es handelt sich hierbei NICHT um die Systemressourcen für Scripte, die per
Webclient aufgerufen werden. Die sind mit anderen Werten beschränkt. Es sind
explizit die Umgebungsparametern in denen ein Script laufen darf, das per
cronjob / Konsole gestartet wird.
Benötige ich für meine Aufgabenstellung nun aber z.B. 140 Sekunden Laufzeit
oder 20 geöffnete Dateien, muß ich die Ausführung "stückeln".
Das Script würde ich dann also so schreiben, das es nach dem Öffnen von 10
Dateien seine Abarbeitung beendet und sich selbst per exec() erneut aufruft.
Es können nun wieder 10 Dateien für das neue Script genutzt werden, so das
ich auf meine gewünschte Gesamtzahl komme. Das ist jetzt nur ein einfaches
Beispiel für die Problematik.
Fazit:
Ich möchte nun also sicherstellen, das ich so arbeiten kann. Also per exec()
die Gesamtaufgabe in n-Stücke verteilen kann, und diese Unterstücke auch
dann weiterlaufen, wenn das erste Script (das vom cronjob gestartet wurde)
bereits über dem Zeitlimit oder einer anderen Beschränkung liegt.
Weiterhin suche ich nach einer komfortablen Möglichkeit, zwischen den
einzelnen Scripten Daten zu übermitteln, damit z.B. das neue Script weiß, an
welchem "Punkt" es mit der Ausführung der Gesamtaufgabe weitermachen muß.
Ich sehe als Möglichkeit, die Daten in eine DB, oder in eine Datei zu
schreiben und jeweils zum Start des Scripts auszulesen. Eventuell gibts da
noch bessere Varianten?
Mein konkretes Problem könnte man mit einer sehr großen Datei vergleichen,
die eingelesen werden muß. Sie kann durch die Serverbeschränkungen aber
nicht in einem Stück verarbeitet werden. Darum die Stückelung.
Jedes Teilscript muß nun aber wissen, an welcher Stelle der Datei es mit der
Abarbeitung weitermachen soll.
Hat es nun z.B. 100 Zeilen der Datei eingelesen, führt es sich selbst per
exec() erneut aus und das neue Script macht an der selben Stelle mit den
nächsten 100 Zeilen weiter.
So das war jetzt eine lange Erklärung, die eigentlich alle Unklarheiten
beseitigen sollte.
t.d
Re: cronjob soll sich selbst aufrufen
am 10.07.2006 13:40:01 von Frank Schenk
Thomas Dartsch wrote:
> Hallo,
>
> und noch eine 'cronjob'-Frage hinterher:
>
> Da einige Webserver mit engen max_execution und max_memory-Werten arbeiten,
> muß ich meinen cronjob seine Gesamtarbeit in einzelnen Unterschritten
> ausführen lassen, da er umfangreiche und zeitaufwendige Prozesse durchführt.
Du stellst den Cronjob so ein, daß er reglmässig gestartet wird.
Du merkst dir, was der Cronjob machen soll, z.B. in einer Datenbank.
Wenn das PHP Script einen Teil erledigt hat markiert es den Job als
erledigt oder löscht ihn. Beim nächsten Aufruf taucht er also nicht mehr
auf.
Nun musst du nur noch race conditions vermeiden (daß z.B. ein Script
noch läuft und das zweite den selben Job nochmal bearbeitet) und dafür
sorgen, daß irgendwann die Jobliste angelegt wird.
gruß, Frank
Re: cronjob soll sich selbst aufrufen
am 10.07.2006 22:32:28 von Thomas Dartsch
"Frank Schenk" schrieb
> Thomas Dartsch wrote:
>> Da einige Webserver mit engen max_execution und max_memory-Werten
>> arbeiten, muß ich meinen cronjob seine Gesamtarbeit in einzelnen
>> Unterschritten ausführen lassen, da er umfangreiche und zeitaufwendige
>> Prozesse durchführt.
>
> Du stellst den Cronjob so ein, daß er reglmässig gestartet wird.
das ist mir klar. Dazu sind cronjobs ja da :)
> Du merkst dir, was der Cronjob machen soll, z.B. in einer Datenbank.
der cronjob? Du meinst das PHP-Skript, das durch den cronjob gestartet wird.
Den Fehler, das Script mit dem cj gleichzusetzen, habe ich auch gemacht und
prompt in diesem Thread einen "Rüffel" erhalten.
> Wenn das PHP Script einen Teil erledigt hat markiert es den Job als
> erledigt oder löscht ihn. Beim nächsten Aufruf taucht er also nicht mehr
> auf.
>
> Nun musst du nur noch race conditions vermeiden (daß z.B. ein Script noch
> läuft und das zweite den selben Job nochmal bearbeitet) und dafür sorgen,
> daß irgendwann die Jobliste angelegt wird.
Nein, die gesamte "Aufgabenliste" soll einmal pro Tag hintereinander
abgearbeitet werden.
Es soll also nur einen cronjob geben, der ein PHP-Script aufruft.
Bei diesem PHP-Script soll aber nach Ablauf eines Teils der Arbeit und bevor
ein timelimit des Servers greift, per exec() das Script selbst wieder
aufgerufen werden.
Zu dem Thema wollte ich nun gern wissen, ob diese "Unterprozesse"
weiterlaufen, auch wenn der erste Durchlauf bereits durch den Server beendet
wurde. (z.B. timeout)
Oder ob es generell eine andere Möglichkeit gibt, eine solche Stückelung zu
machen.
t.d
Re: cronjob soll sich selbst aufrufen
am 10.07.2006 23:36:27 von Christoph Jeschke
Am Mon, 10 Jul 2006 22:32:28 +0200 schrieb Thomas Dartsch:
> Es soll also nur einen cronjob geben, der ein PHP-Script aufruft.
> Bei diesem PHP-Script soll aber nach Ablauf eines Teils der Arbeit und bevor
> ein timelimit des Servers greift, per exec() das Script selbst wieder
> aufgerufen werden.
> Zu dem Thema wollte ich nun gern wissen, ob diese "Unterprozesse"
> weiterlaufen, auch wenn der erste Durchlauf bereits durch den Server beendet
> wurde. (z.B. timeout)
Hierbei könnte dir nohup helfen. nohup koppelt einen Prozess von seinem
Elternprozess ab.
Die Manpage findest du auf deinem System.
GruÃ,
Christoph
Re: cronjob soll sich selbst aufrufen
am 11.07.2006 00:22:11 von Carsten Wiedmann
Thomas Dartsch schrieb:
> Ich möchte nun also sicherstellen, das ich so arbeiten kann. Also per
> exec() die Gesamtaufgabe in n-Stücke verteilen kann, und diese
> Unterstücke auch dann weiterlaufen, wenn das erste Script (das vom
> cronjob gestartet wurde) bereits über dem Zeitlimit oder einer anderen
> Beschränkung liegt.
Wenn es für Script A (Process der hier über den CronJob gestartet wird) ein
Resource Limit gibt (z.B. "cputime" oder "memoryuse") und Script A ruft über
exec() ein weiteres Script (Process Script B) auf, dann erbt Script B die
Limnits von Script A, die Zähler beginnen aber wieder bei 0 für Script B. Da
Script B das Script A überlagert, bleiben die Zähler bei Script A so lange
stehen, bis Script B beendet wurde und Script A wieder weiterläuft.
Ergo kann Script A nicht vor Script B beendet werden durch Resource Limits.
Ausser es kommt dadurch erst gar nicht mehr bis zum exec().
Allerdings sollte man die Rekursionstiefe der exec()-Aufrufe auch nicht zu
weit treiben, da sonst noch andere Limits (z.B. "maxproc" oder "openfiles")
zuschlagen könnten und weitere exec()'s verhindern.
Wie schon erwähnt:
Nicht vergessen, dass es abgesehen von den Resource Limits vom System für
Processe, auch die separat zu konfigurierenden Limits für PHP gibt (bei
Shellscripts: "memory_limit" in "php.ini").
> Weiterhin suche ich nach einer komfortablen Möglichkeit, zwischen den
> einzelnen Scripten Daten zu übermitteln, damit z.B. das neue Script
> weiß, an welchem "Punkt" es mit der Ausführung der Gesamtaufgabe
> weitermachen muß. Ich sehe als Möglichkeit, die Daten in eine DB, oder
> in eine Datei zu schreiben und jeweils zum Start des Scripts
> auszulesen. Eventuell gibts da noch bessere Varianten?
Wie du schon im PHP-Manual [1] gelesen hast, kann man auch in der Shell
einem PHP-Script Parameter mitgeben. Eben das machst du dann im exec(). Im
Script wertest du am Anfang dann diesen Parameter aus und verfährst dem
entsprechend.
Gruß
Carsten
[1] http://de.php.net/manual/en/features.commandline.php
Re: cronjob soll sich selbst aufrufen
am 11.07.2006 12:49:01 von Frank Schenk
Thomas Dartsch wrote:
> Nein, die gesamte "Aufgabenliste" soll einmal pro Tag hintereinander
> abgearbeitet werden.
> Es soll also nur einen cronjob geben, der ein PHP-Script aufruft.
> Bei diesem PHP-Script soll aber nach Ablauf eines Teils der Arbeit und bevor
> ein timelimit des Servers greift, per exec() das Script selbst wieder
> aufgerufen werden.
> Zu dem Thema wollte ich nun gern wissen, ob diese "Unterprozesse"
> weiterlaufen, auch wenn der erste Durchlauf bereits durch den Server beendet
> wurde. (z.B. timeout)
> Oder ob es generell eine andere Möglichkeit gibt, eine solche Stückelung zu
> machen.
nohup wurde dir ja schon genannt.
Ob der cronjob (bzw. das vom Cronjob aufgerufene Script) alle 5 Minuten,
1mal die Stunde oder 1mal am Tag (cron.daily) läuft ist im Prinzip egal,
da du bei meinem Beispiel durch das Anlegen von Jobs z.B. in einer
Datenbank steuerst, wann das Cronjobscript gefüttert/ausgeführt wird.
Frank