Подтвердить что ты не робот

libclntsh.so.11.1: не удается открыть общий объектный файл.

Я хочу запланировать задачу в Linux с помощью icrontab, и задача написана на python и должна импортировать модуль cx_Oracle, поэтому я экспортирую ORACLE_HOME и LD_LIBRARY_PATH в .bash_profile, но это cx_Oracle ошибку:

libclntsh.so.11.1: не удается открыть общий объектный файл.

Так как можно выполнить задачу, выполнив команду в оболочке, например:

python a.py  # ok

Я изменяю задачу в icrontab на сценарий оболочки, который вызывает мой сценарий Python, но исключение повторяется?

# the shell script scheduled in icrontab
#! bash 
python a.py    

Не могли бы вы помочь, как это сделать?

4b9b3361

Ответ 1

Возможно, вы хотите указать PATH - и также ORACLE_HOME и LD_LIBRARY_PATH - чтобы cron(1) знал, где искать бинарные файлы.
Прочтите "5 Crontab environment" здесь.

Ответ 2

Библиотеки находятся в /u01/app/oracle/product/11.2.0/xe/lib (для Oracle XE) или аналогичный.

Вы должны добавить этот путь к /etc/ld.so.conf или если этот файл показывает только местоположение включения, как в отдельном файле в каталоге /etc/ld.so.conf.d

У меня есть oracle.conf в /etc/ld.so.conf.d, только один файл с контуром. Больше ничего.

Конечно, не забудьте запустить ldconfig как последний шаг.

Ответ 3

Cron не загружает профиль пользователя при запуске задачи, и вы должны явно указать профиль в своей оболочке script.

Примерная документация

Ответ 4

Я столкнулся с той же проблемой в прошлые выходные, когда мне нужно было использовать cx_Oracle. Проведя много времени, пытаясь изменить переменную LD_LIBRARY_PATH, чтобы включить $ORACLE_HOME/lib directoy, где находится libclntsh.so, я решил решить эту проблему, создав символические ссылки из всех библиотек Oracle xlibx.so в/lib/xlibx.так. Это, безусловно, не "самое чистое" решение, но оно имеет хорошие шансы на работу, не вызывая слишком больших проблем:

 cd $ORACLE_HOME/lib
 for f in `ls ./*.so*`; do;
   sudo ln -s $ORACLE_HOME/lib/$f /lib/$f 
 done

После того, как я это сделал, cx_Oracle работал как шарм.

Ответ 5

Это сообщение помогло мне решить аналогичную проблему с ссылкой на базу данных PostgreSQL для Oracle, используя oracle_fdw.

Я установил oracle_fdw, но когда я попробовал CREATE EXTENSION oracle_fdw;, я получил error could not load library libclntsh.so.11.1: cannot open shared object file: No such file or directory.

Я проверил $ORACLE_HOME, $PATH и $LD_LIBRARY_PATH.

Он работал только после того, как я поместил общую коллекцию Oracle в общую коллекцию Linux

echo /opt/instantclient_11_2 > oracle.conf
ldconfig

Ответ 6

Если у вас есть проблема с libclntsh.so, необходимо создать символическую ссылку для libclntsh.so от /usr/lib/oracle/11.2/client64/lib до /usr/lib

Ответ 7

Просто передайте переменные пути Oracle перед запуском любых скриптов:
Как и для perl, вы можете добавить ниже в начале вашего script:

BEGIN {
   my $ORACLE_HOME     = "/usr/lib/oracle/11.2/client64";
   my $LD_LIBRARY_PATH = "$ORACLE_HOME/lib";
   if ($ENV{ORACLE_HOME} ne $ORACLE_HOME
   || $ENV{LD_LIBRARY_PATH} ne $LD_LIBRARY_PATH
   ) {
      $ENV{ORACLE_HOME}     = "/usr/lib/oracle/11.2/client64";
      $ENV{LD_LIBRARY_PATH} = "$ORACLE_HOME/lib";
      exec { $^X } $^X, $0, @ARGV;
   }
}

Ответ 8

У меня всегда есть эта проблема, я могу решить, выполнив приведенный ниже код: export LD_LIBRARY_PATH =/opt/oracle/instantclient: $LD_LIBRARY_PATH

введите описание изображения здесь

OBS: Этот код, который я сохранил в файле конфигурации, потому что я всегда его использую. удачи.

Ответ 9

Я скопировал все библиотечные файлы из установочных носителей /stage/ext/lib в $ ORACLE_HOME/lib, и это решило проблему.

Ответ 10

Для того, чтобы кто-нибудь еще пришел сюда, лучше всего обновить cx_Oracle до последней версии (6+). Эта версия вообще не требует установки LD_LIBRARY_PATH.

Ответ 11

Я должен был установить зависимость

Оракул-instantclient12.2 основного-12.2.0.1.0-1.x86_64