2009-05-05 5 views
3

Я бегу следующий сценарий на cronjob ...PHP Ошибки на 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 или что-то в нем. Я даже пытался добавить точный путь

ответ

5

Подсказка 1: Убедитесь, что у вас есть точно такой же $ PATH в хрон:

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.

+0

Ну, у меня есть путь экспорта, я думаю, что у меня было $ перед PATH в экспорте. Мой окр является: Hostname = ***** TERM = XTERM SHELL =/бен/Баш HISTSIZE = 1000 SSH_CLIENT = 70.48.253.46 61056 22 OLDPWD =/и т.д. SSH_TTY =/DEV/PTS/0 USER = корень MAIL =/var/spool/mail/root PATH =/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin :/bin:/usr/sbin:/usr/bin:/usr/bin:/usr/bin: INPUTRC =/etc/inputrc PWD =/etc/cron.hourly SHLVL = 1 HOME =/root LOGNAME = корень LESSOPEN = |/usr/bin/less pipe.sh% s G_BROKEN_FILENAMES = 1 _ =/bin/env – MichaelICE

+0

Итак, похоже, что нет важных env vars, которые мне не хватает. – MichaelICE

+0

Не могли бы вы изменить вопрос, чтобы он включал в себя самую современную работу cron? – pts

3

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

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

1

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

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

мне пришлось иметь дело с этим вопросом несколько раз на моем последний проект и основное решение заключается в следующем:

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

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