2009-05-12 39 views
9

Ich habe einen Cron-Job, der ein PHP-Skript ausführt. Der Cron ist eingerichtet, um jede Minute zu laufen, dies wird nur für Testzwecke getan. Das PHP-Skript, das es ausführt, wurde entwickelt, um Videos, die von Benutzern auf den Server hochgeladen wurden, in ein Flash-Format (zB ... .flv) zu konvertieren. Das Skript wird ausgeführt, wenn es manuell über die Befehlszeile ausgeführt wird. Bei der Ausführung über Cron startet es jedoch einwandfrei, nach einer Minute jedoch stoppt es.Wird durch einen Cron-Job die letzte Cron-Ausführung beendet?

Es scheint, dass, wenn der nächste Cron ausgeführt wird, es "tötet" die letzte Cron-Ausführung. Ich habe die folgende PHP-Funktion:

ignore_user_abort(true); 

In der Hoffnung, dass es nicht die letzte Ausführung abbrechen würde ich den Cron getestet Einstellung alle 5 Minuten laufen zu lassen, die über kann jedoch eine Umwandlung eines Videos nehmen funktioniert gut 5 Minuten, also muss ich herausfinden, warum es aufhört, wenn ein anderer Cron ausgeführt wird.

Jede Hilfe wäre willkommen.

Vielen Dank!

EDIT: Meine cron wie folgt aussieht:

*/1 * * * * php /path_to_file/convert.php 
+0

Haben Sie das PHP-Fehlerprotokoll überprüft? Haben Sie set_time_limit verwendet, um das Zeitlimit auf 0 zu setzen? –

+0

Keine Fehler, ich setze auch das Zeitlimit auf 0. Ich vergaß zu erwähnen, dass mein Cron aussieht wie:

 */1 * * * * php /path_to_file/convert.php 
Danke! –

+0

Es scheint, dass der Cron-Job nicht überschreibt, was zuletzt bearbeitet wurde, da etwas im PHP-Code fehlerhaft war. Ich habe eine Überprüfung hinzugefügt, um sicherzustellen, dass sie beendet wird, aber das Hinzufügen einer temporären Sperrdatei, die von Sander erwähnt wurde, funktionierte perfekt. Danke! –

Antwort

17

Ich glaube nicht, dass Cron irgendwelche Prozesse tötet. Cron eignet sich jedoch nicht für lang andauernde Prozesse. Was hier passieren kann, ist, dass Ihr Skript bei der mehrmaligen Ausführung komplett auf sich selbst trampelt. Zum Beispiel versuchen beide PHP-Prozesse, in dieselbe Datei gleichzeitig zu schreiben.

Zuerst stellen Sie sicher, dass Sie nicht nur im PHP-Fehlerprotokoll suchen, sondern auch versuchen, die Ausgabe von der PHP-Datei selbst zu erfassen. Beispiel:

*/1 * * * * * php /path/to/convert.php & >> /var/log/convert.log 

Sie könnten auch eine vereinfachte Sperrdatei verwenden, um sicherzustellen, dass convert.php nicht mehrfach ausgeführt wird. Etwas wie:

if (file_exists('/tmp/convert.lock')) { 
    exit(); 
} 

touch('/tmp/convert.lock'); 
// convert here 
unlink('/tmp/convert.lock'); 
+3

Cron wird einen Prozess NICHT töten. Das Skript (oder etwas, das das Skript aufruft) bekommt seinen eigenen Weg. –

3

cron selbst keine vorherige Instanz eines Auftrags so laufen stoppen, wenn es ein Problem gibt, es etwas in Ihrem PHP fast sicher ist, es zu tun. Sie müssen diesen Code posten.

1

Nein, wird es nicht. Sie können die Ausführung eines zweiten Prozesses verhindern, indem Sie eine Sperrdatei erstellen, nach der das Skript bei jedem Lauf sucht. Wenn die Datei existiert, wird sie nicht ausgeführt. Dies sollte gegebenenfalls auch in Verbindung mit einer maximalen Ausführungszeit verwendet werden, so dass ein Prozess künftige Ausführungen nicht auf unbestimmte Zeit hindert. Die Sperrdatei kann einfach eine leere Nur-Text-Datei namens /tmp/foo.lock sein.

Verwandte Themen