Cronjob timeout / cronjob automatisch abschießen

FiX

Registered User
Ich habe einen Cronjob, der ein php script ausführen soll. Ein Teil davon ist der Download einer Datei von einem anderen Server. Leider ist die Verbindung da recht schlecht, so dass er beim Download teilweise hängen bleibt - dadurch bleibt der Prozess dann aber aktiv. Ich habe jetzt schon überlegt ihn einfach nachts 5x zu starten, dann sollte er zumindest einmal durchlaufen - ich bräuchte dann nur noch eine Art die fehlgeschlagenen abzubrechen. Mit einem PHP timeout geht das leider nicht, da er anscheinend die Downloadzeit nicht als PHP Laufzeit mitrechnet? Jeden Tag die fehlgeschlagenen selber per Hand zu entfernen ist dann doch etwas viel Arbeit..

Code:
<?php
error_reporting(E_ALL);
set_time_limit(500);
ini_set("max_execution_time",500);
$laufzeit = array_sum(explode(" ",microtime()));


$file    = 'http://arena.gamespy.com/ladder/xml/43738';
$dest    = 'tw_ladder.xml';
$sql     = 'tw_ladder.sql';

$buffer  = fopen($dest, "w");
$file    = fopen($file, "rb");

$chunk   = 1048576;

while (!feof($file))
{
	fputs($buffer, fread($file, $chunk));
}

fclose($file);
fclose($buffer);

Ist der Anfang vom Script - also auch der Teil, bei dem er sich öfters verabschiedet.

Hat da jmd eine Idee?

Ich hatte auch schon überlegt ob ich es per wget mache, allerdings überschreibt wget die Datei nicht, sondern legt dann lauter datei.1 datei.2 datei.3 usw an, womit das Script natürlich nichts anfangen kann, da es genau auf "datei" wartet.
 
Last edited by a moderator:
Vielleicht sagst Du uns noch, wie der Cronjob ausgeführt wird.
Denn wenn Du PHP als CLI ausführst, gibt es da wohl Probleme:
PHP: PHP auf der Kommandozeile - Manual

Ausserdem zählen alle Formen des Streamings nicht in die max_execution_time. Womit Dein o.g. Download wohl betroffen ist.

Evtl. könntest Du einfach nach einer bestimmten Zeit einen "killall [Scriptname]" als Cronjob setzen.

huschi.
 
Last edited by a moderator:
Hm ja schade, ich führe es über die CLI aus:
nice /usr/bin/php5 /root/dynsig/xml.php

Könnte man vielleicht ein ganz simples Script um das PHP Script herumschreiben, dass selber einfach nur zu einer bestimmten Zeit hochzählt und dann abbricht, wenn nach der Zeit X das aufgerufene PHP Script noch nicht beendet ist? Ich habe leider nur begrenzte Fähigkeiten was Coding angeht - und der, der das Script schreibt kennt halt auch nur PHP und nicht die Untiefen der UNIX Scripte.

Mit kill muss ich ja die ProzessID angeben, die kenne ich ja vorher nicht vom Cronjob? Hatte sonst auch schon die Idee einfach einen Cronjob ~20 Minuten nach dem ersten reinzusetzen, der dann per Kill den Prozess schließt - aber halt ohne die ID zu kennen?

edit: Hm doch stimmt! Ein einfaches killall php5 funktioniert. Danke, das ist zwar keine elegante Lösung, aber für mich reicht das erstmal :)
 
Last edited by a moderator:
Zwei weitere Möglichkeiten:
a) Du Programmierst das Script so um, daß es Timeout's nutzt.
b) Du setzt im Cronjob vorher ein "ulimit -t [sekunden]".

huschi.
 
Back
Top