PHP ошибки на cronjob, отлично работает при подсказке - PullRequest
3 голосов
/ 05 мая 2009

Я выполняю следующий скрипт на cronjob ...

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

и получаю следующие ошибки:

[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

Однако, когда я запускаю тот же скрипт из командной строки, вошел в систему - он работает без ошибок.

Это моя строка $ PATH в приглашении:

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

Есть идеи или предложения? Я уверен, что при запуске cronjob у него нет пути к lib или чего-либо включенного. Я даже попытался добавить точный путь

Ответы [ 4 ]

5 голосов
/ 05 мая 2009

Совет 1: убедитесь, что у вас точно такой же $ PATH в задании cron:

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

Совет 2: Убедитесь, что все остальные переменные среды также совпадают. Создайте дамп среды с помощью команды env и добавьте соответствующий экспорт в задание cron.

3 голосов
/ 05 мая 2009

Обычно, когда во время cron происходит сбой, но он запускается в командной строке, это разрешения, рабочий каталог или переменные окружения.

Похоже, что сам исполняемый файл php не загружает библиотеки, возможно, проблема не в вашем скрипте.

1 голос
/ 06 мая 2009

Когда вы запускаете скрипт в задании cron, он запускается в ограниченной оболочке с очень небольшим количеством установленных переменных окружения. Судя по вашим ошибкам, похоже, что это может быть LD_LIBRARY_PATH, который нужно установить, поскольку ошибки относятся к куче общих библиотек, но это всего лишь предположение. Похоже, что правильные пути к библиотекам для PHP не установлены правильно в скрипте cron.

Вы можете захватить среду, используемую при запуске скрипта cron, добавив команду env в скрипт и записав результат. Сравните это с выводом env в приглашении и найдите варианты. Скорее всего, они будут из команд, выпущенных в вашем локальном или системном профиле или bashrc (или, возможно, даже .login ) файлах, которые устанавливают пути к библиотекам. Я бы специально искал пути и переменные, связанные с PHP, так как это, кажется, ваша проблема.

Мне приходилось сталкиваться с этой проблемой несколько раз в моем последнем проекте, и основное решение:

  1. определяет минимальную среду, необходимую для выполнения скрипта
  2. создать короткий скрипт, который устанавливает желаемую среду
  3. добавьте вызов сценария из пункта 2 в сценарии, запускающий ваши приложения, чтобы среда была правильно настроена.
  4. Тщательно проверьте, чтобы убедиться, что вы ничего не пропустили: -).
0 голосов
/ 03 мая 2011

Когда задание cron запускается из пользовательского crontab, оно выполняется от имени этого пользователя. Однако он не создает никаких файлов в домашнем каталоге пользователя, таких как .profile, .cshrc, .bashrc или любой другой файл. Если вам нужен cron для получения (чтения) любого файла, который понадобится вашему скрипту, вы должны сделать это из скрипта, который вызывает cron. Установка путей, получение файлов, установка переменных среды и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...