Ответ 1
Возможно, вы хотите указать PATH
- и также ORACLE_HOME
и LD_LIBRARY_PATH
- чтобы cron(1)
знал, где искать бинарные файлы.
Прочтите "5 Crontab environment" здесь.
Я хочу запланировать задачу в 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
Не могли бы вы помочь, как это сделать?
Возможно, вы хотите указать PATH
- и также ORACLE_HOME
и LD_LIBRARY_PATH
- чтобы cron(1)
знал, где искать бинарные файлы.
Прочтите "5 Crontab environment" здесь.
Библиотеки находятся в
/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 как последний шаг.
Cron не загружает профиль пользователя при запуске задачи, и вы должны явно указать профиль в своей оболочке script.
Я столкнулся с той же проблемой в прошлые выходные, когда мне нужно было использовать 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 работал как шарм.
Это сообщение помогло мне решить аналогичную проблему с ссылкой на базу данных 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
Если у вас есть проблема с libclntsh.so, необходимо создать символическую ссылку для libclntsh.so от /usr/lib/oracle/11.2/client64/lib
до /usr/lib
Просто передайте переменные пути 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;
}
}
У меня всегда есть эта проблема, я могу решить, выполнив приведенный ниже код: export LD_LIBRARY_PATH =/opt/oracle/instantclient: $LD_LIBRARY_PATH
OBS: Этот код, который я сохранил в файле конфигурации, потому что я всегда его использую. удачи.
Я скопировал все библиотечные файлы из установочных носителей /stage/ext/lib в $ ORACLE_HOME/lib, и это решило проблему.
Для того, чтобы кто-нибудь еще пришел сюда, лучше всего обновить cx_Oracle
до последней версии (6+). Эта версия вообще не требует установки LD_LIBRARY_PATH
.
Я должен был установить зависимость
Оракул-instantclient12.2 основного-12.2.0.1.0-1.x86_64