PHP ошибки на cronjob, отлично работает при подсказке

StackOverflow https://stackoverflow.com/questions/826552

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Совет 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.

Другие советы

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

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top