Frage

Ich verwende das folgende Skript auf einem Cronjob ...

cd /etc/parselog/
php run_all.php >/dev/null

und sind immer folgende Fehler:

[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './pdo.so' - ./pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './mysql.so' - ./mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './mysql.so' - ./mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './mysqli.so' - ./mysqli.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './odbc.so' - ./odbc.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './pdo.so' - ./pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './pdo_mysql.so' - ./pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './pdo_odbc.so' - ./pdo_odbc.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './pdo_sqlite.so' - ./pdo_sqlite.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Fatal error:  Call to undefined function mysql_connect() in /etc/parselog/stats_downloads.php on line 5

Allerdings, wenn ich das gleiche Skript von der Kommandozeile ausführen, in- es protokolliert funktioniert perfekt ohne Fehler.

Das ist mein $ PATH Zeichenfolge an der Eingabeaufforderung:

$PATH = /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

Irgendwelche Ideen oder Anregungen? Ich bin sicher, wenn Sie den Cronjob, es verfügt nicht über einen Lib-Pfad oder etwas enthalten. Ich habe sogar versucht, den genauen Pfad Hinzufügen

War es hilfreich?

Lösung

Tipp 1: Stellen Sie sicher, Sie haben genau die gleichen $ PATH in dem Cron-Job:

cd /etc/parselog/
export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
php run_all.php >/dev/null

Tipp 2: Stellen Sie sicher, dass alle anderen Umgebungsvariablen als auch übereinstimmen. Sichern Sie die Umgebung mit dem Befehl env, und fügen Sie die entsprechenden Ausfuhren in Ihre Cron-Job.

Andere Tipps

Im Allgemeinen, wenn etwas während cron nicht, sondern läuft auf der Kommandozeile ist es Berechtigungen, Arbeitsverzeichnis, oder Umgebungsvariablen.

Es sieht aus wie die ausführbare PHP-Datei selbst nicht die Bibliotheken geladen wird, kann das Problem nicht in Ihrem Skript sein.

Wenn Sie ein Skript in einem Cron-Job ausführen, wird es in einer begrenzten Schale mit sehr wenigen Umgebungsvariablen ausführen. Von Ihrem Fehler, es sieht aus wie es die LD_LIBRARY_PATH sein kann, die eingestellt werden müssen, da die Fehler auf ein Bündel von gemeinsam genutzten Bibliotheken betreffen, aber das ist nur eine Vermutung. Es sieht aus wie die richtigen Bibliothekspfade für PHP sind nicht richtig in dem Cron-Skript aufgebaut.

Sie können die Umgebung verwendet erfassen, wenn durch Zugabe des env Befehl an das Skript des Cron-Skript ausgeführt wird und die Ausgabe zu erfassen. Vergleichen Sie dies mit dem env Ausgang an der Eingabeaufforderung und suchen Sie nach Variationen. Wahrscheinlich werden sie von Befehlen entweder in Ihrem lokalen oder System Profil ausgegeben werden oder bashrc (oder vielleicht sogar .login ) Dateien, die Bibliothek einrichten Wegen. Ich würde speziell suchen nach Wegen und Variablen im Zusammenhang mit PHP, da dies Ihr Problem zu sein scheint.

Ich hatte mit dieser Frage mehrmals auf meinem letztes Projekt und die Basislösung umgehen:

  1. bestimmen die minimale Umgebung erforderlich, um das Skript auszuführen
  2. ein kurzes Skript erstellen, das die gewünschte Umgebung einrichtet
  3. fügen Sie einen Anruf an das Skript von Punkt 2 im Skript starten Sie Ihre Anwendungen so, dass die Umgebung richtig eingerichtet ist.
  4. Test gründlich, um sicherzustellen, Sie haben nichts vermisst: -).

Wenn ein cron-Job von den Benutzern ausgeführt wird crontab es als dieser Benutzer ausgeführt wird. Es ist jedoch nicht bezieht alle Dateien im Benutzerverzeichnis wie ihrem .profile, .cshrc oder .bashrc oder jede andere Datei. Wenn Sie Cron Quelle müssen (lesen) alle Dateien, die Ihr Skript müssen Sie es aus dem Skript cron tun sollten ruft. Festlegen Pfade, Sourcing-Dateien, Umgebungsvariablen, etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top