Thomas Maier | Magento & WordPress Develover post@webzunft.de | +49 162 9313 708

Antworten auf die Fragen – nicht nur meiner Kunden 

RSS
Home Magento Magento für Entwickler Magentos cron.sh auf einem 1&1 Managed Server

Magentos cron.sh auf einem 1&1 Managed Server

Shell-Skripte sind nicht meine Stärke. Ein Fall, bei dem Magento aber auf ein solches angewiesen ist sind die cron-Jobs. Ich habe diesen mit einem Kunden gerade erfolgreich auf einem 1&1 Managed Server eingerichtet und beschreibe hier kurz, was dabei zu beachten war.

cron.sh oder cron.php

Es gibt in Magento zwei Möglichkeiten, einen cron-Job auszuführen. Entweder wir steuern das Shell-Skript cron.sh an oder rufen die Datei cron.php auf. Beide liegen im Root-Verzeichnis. Die php-Datei kann über jeden anderen cron-Job-Dienst und selbst den Browser aufgerufen werden. Dabei hängt es jedoch vom entsprechenden Dienst ab, ob dieser die Ausführung nicht vorher abbricht. Daher empfiehlt sich im Zweifel immer, die cron.sh auszuführen, die letztendlich nur dafür sorgt, dass die cron.php auf dem Server ausgeführt wird.

Dieses Wissen ist hilfreich, weil man sich bei Problemen wie im Folgenden beschrieben nach und nach an die Lösung heranarbeiten kann.

Trockentests

Mit folgenden Möglichkeiten könnt ihr testen, ob und wie cron-Jobs bei euch funktionieren.

Ihr könnt übrigens von Hause aus nur in der Datenbank in der Tabelle cron_schedule nachschauen, ob einer der unten getätigten Aufrufe erfolgreich war. Zwar gibt es jeweils noch andere Möglichkeiten, aber wer 5 Minuten zwischen den Tests warten kann, dem reicht die Datenbank vollkommen aus.

URL direkt aufrufen

Gebt einfach folgendes in den Browser ein:

http://www.meinshop.tld/cron.php

 

Wobei klar ist, dass ihr die richtige URL verwenden müsst.
Sowohl keine Ausgabe als auch, modulabhängig, eine Nachricht zu dem, was passiert ist, sind hier gute Nachrichten. Fehlermeldungen sind schlechte Nachrichten, liegen aber meist an unzureichenden Dateirechten, fehlenden Dateien oder einer fehlgeschlagenen Installation.

Wer jetzt keinen Shell-Zugang zum Server hat, der muss die URL wohl über einen vom Anbieter bereitgestellten externen cron-Job aufrufen. Auch das läuft bei einem Kunden von mir erfolgreich.

Tests in der Shell

Wenn der direkte Aufruf der cron.php im Browser klappt, dann könnt ihr euch an den nächsten Schritt wagen. Den Aufruf über die Shell. Dabei müsst ihr euch in euren Server einloggen. In der Shell gebt ihr dann den absoluten Pfad zur cron.php ein. Bei 1&1 sieht das in etwa so aus:

/kunden/homepages/12/a123123123/htdocs/executable/magento/cron.php

In meinem Fall kam hier die erste Überraschung in Form folgender Fehlermeldung.
X-Powered-By: PHP/4.4.9
Content-type: text/html

Parse error:  syntax error, unexpected T_OBJECT_OPERATOR in /homepages/35/d439573786/htdocs/executable/shop/cron.php on line 39

Die Ursache findet ihr in der ersten Zeile. Der Managed Server von 1&1 erkennt automatisch, dass es sich um ein php-Skript handelt, verwendet aber ‚php‘ als Alias für ‚php4‘. Der folgende Aufruf sollte daher erfolgreich sein:
php5 /kunden/homepages/12/a123123123/htdocs/executable/magento/cron.php

Das ist der erste Grund, warum ein aus vielen Tutorials kopierter Cronjob hier nicht funktionieren kann.

cron.sh bearbeiten

Die Nutzung von php4 ist auch die Ursache dessen, dass der Aufruf der cron.sh eine Fehlermeldungen auswirft. Um das zu korrigieren, müssen wir die cron.sh bearbeiten. In Zeile 9 finden wir die dafür zuständige Angabe.

PHP_BIN=`which php`

Hierbei sind drei Dinge zu beachten:

  • Es handelt sich um ein Skript, keine PHP-Datei
  • Die schrägen Anführungszeichen bedeuten die Ausführung eines Befehls in der Shell, nicht die Angabe eines Strings
  • Die Ausgabe für which php ist in diesem Fall der Pfad zu php4.

Was wir jetzt brauchen ist der Pfad zu php5. Diesen können wir wie folgt ermitteln:

whereis php5

Die Ausgabe sollte positiv sein und mehrere Pfade übermitteln. Wählt einen aus und kopiert diesen in die cron.sh. In meinem Fall habe ich diesen gewählt.

PHP_BIN=“/usr/bin/php5″

Hier seht ihr, dass es sich nicht mehr um einen Befehl handelt, sondern wirklich ein String übergeben wird. Die vorherige Zeile habe ich übrigens für den Fall der Fälle mit einem ‚#‘ auskommentiert.

Jetzt weiß auch die cron.sh wie es die cron.php aufrufen soll.

Wie sieht der Cronjob aus?

Der Cronjob selbst wird in die crontab-Datei eingetragen. Unten findet ihr einige Quellen, die euch den Syntax erläutern. In meinem Fall war es nicht mehr notwendig, vor dem Pfad noch anzugeben, dass die cron.sh als Shell-Skript ausgeführt werden muss. Wer sich dafür entscheidet in der crontab die cron.php aufzurufen, sollte jedoch zumindest php5 angeben.

Dateirechte

Dateirechte können übrigens wirklich ein Problem darstellen. Die beiden cron-Dateien brauchen hier mindestens 755.

Weitere Quellen zu cronjobs und Magento

offizielle Hilfeseite von Magento zu cron-Jobs; leider mit zu wenig Erklärungen zu den verschiedenen Möglichkeiten

gute Kurzübersicht von 1&1 zu Cronjobs.

Anlegen von Cronjobs – Anleitung ebenfalls von 1&1

 
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn
3 Comments  comments 

3 Antworten

  1. Tobias

    Vielen Dank für die ausführliche Anleitung. Bei mir hat diese nicht ganz zum Erfolg geführt. Entweder hat 1&1 inzwischen die Logik geändert oder es gibt eine Abhängigkeit zu den einzelnen PHP-Versionen. Bei mir hat die folgende Version zum Erfolg geführt:
    PHP_BIN="/usr/bin/php5.4"

  2. Matze

    Danke für die Anleitung. Jedoch nicht mit “ sondern mit ‚: PHP_BIN=’/usr/bin/php5.5‘

    Bei Webhosting Paket funktioniert das jedoch nicht, hier muss die cron.php direkt angesprochen werden. Nach Anleitung 1und1:
    * * * * /usr/bin/lynx -auth=user:password -source http://1und1hilfe.de/test.php5

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.