2010-04-25 1 views
17

Я хочу запланировать задачу на linux с помощью icrontab, и задача написана на python и имеет значение import cx_Oracle module, поэтому я экспортирую ORACLE_HOME и LD_LIBRARY_PATH в .bash_profile, но это поднять ошибку:libclntsh.so.11.1: не удается открыть файл общих объектов

libclntsh.so.11.1: cannot open shared object file. 

Поскольку это нормально для выполнения задачи по выпускам команды в оболочке, как

python a.py  # ok 

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

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

Не могли бы вы помочь в этом?

ответ

15

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

+0

но я обновляю сценарий оболочки, как показано ниже: #!/bin/bash echo $ ORACLE_HOME echo $ LD_LIBRARY_PATH и перенаправить вывод crontab в файл журнала , почему этот путь был найден и записан в журнал? –

+0

@zhangzhong Я полагаю, вы хотели бы использовать 'export' not' echo'? E. g. 'export ORACLE_HOME =/usr/lib/oracle10/foo' и' export LD_LIBRARY_PATH =/usr/lib/bar' –

2

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

Example documentation

1

Я столкнулся с этой же проблемой в прошлые выходные, когда мне нужно использовать 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 работал как шарм.

+0

Я решил его после включения в скрипт:. ~/.bash_profile –

+0

Откуда вы включили скрипт? –

+0

Технически это будет работать, но это неправильный ответ, так как в следующий раз, когда вы обновите клиент Oracle, это может сломаться (и его нужно будет повторно запустить). Лучший ответ - исправить скрипт, который нуждается в Python/Oracle, и правильно установить значения среды. –

6

Библиотеки находятся в /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 в качестве последнего шага.

+0

какой контент должен содержать «oracle.conf»? – Gank

1

Это сообщение помогло мне решить аналогичную проблему с ссылкой на базу данных 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 Shared Library на Linux Shared Library

echo /opt/instantclient_11_2 > oracle.conf 
ldconfig 
+0

где вы вывел oracle.conf? –

+0

Я полагаю, что это должно быть 'echo/opt/instantclient_11_2>/etc/ld.so.conf.d/oracle.conf'. – danielp

0

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

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; 
    } 
} 
1

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

0

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

enter image description here

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

Смежные вопросы