libclntsh.so.11.1:无法打开共享目标文件

问题描述:

我想通过icrontab在linux上安排任务,并且任务是用python编写的,必须导入cx_Oracle模块,因此我在.bash_profile中导出ORACLE_HOME和LD_LIBRARY_PATH,但 它引发错误:libclntsh.so.11.1:无法打开共享目标文件

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

因为它是确定的问题shell来运行任务的命令一样

python a.py  # ok 

我改变任务icrontab到一个shell脚本调用我的Python脚本,但例外recu rred?

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

你能帮忙怎么处理它吗?

可能要指定PATH - 还有ORACLE_HOMELD_LIBRARY_PATH - 以便cron(1)知道在哪里可以找到二进制文件。
阅读“5 Crontab环境”here

+0

但我们更新了如下的shell脚本: #!/bin/bash echo $ ORACLE_HOME echo $ LD_LIBRARY_PATH 并将crontab的输出重定向到日志文件 为什么这些路径被发现并写入日志? – 2010-04-25 14:17:59

+0

@zhangzhong我想你想用'export'而不是'echo'? E.例如, 'export ORACLE_HOME =/usr/lib/oracle10/foo'和'export LD_LIBRARY_PATH =/usr/lib/bar' – 2010-04-26 09:36:57

在运行任务时,Cron不会加载用户的配置文件,并且您必须明确地将配置文件包含在shell脚本中。

Example documentation

当我需要使用cx_Oracle我碰到了同样的问题最后一个周末。花费了大量时间尝试修改LD_LIBRARY_PATH变量以包含libclntsh.so驻留的$ ORACLE_HOME/lib directoy之后,我最终通过从所有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 – 2010-04-27 11:20:14

+0

你从哪里包含脚本? – 2010-04-29 22:59:35

+0

从技术上讲,这会起作用,但这是错误的答案,因为下次您更新Oracle客户端时,可能会中断(并且需要重新运行)。更好的答案是修复需要Python/Oracle的脚本并正确设置环境值。 – 2010-09-01 22:07:14

该库位于 /u01/app/oracle/product/11.2.0/xe/lib(适用于Oracle XE)或类似库。

您应该将此路径添加到/etc/ld.so.conf或者如果该文件只显示一个包含位置,在/etc/ld.so.conf.d目录

我在/etc/ld.so.conf.d oracle.conf,只有一个文件的路径一个单独的文件。没有其他的。

当然,不要忘记运行ldconfig作为最后一步。

+0

“oracle.conf”应该写什么内容? – Gank 2017-08-19 02:23:14

这篇文章帮助我通过使用oracle_fdw来解决PostgreSQL数据库链接到Oracle的类似问题。

我安装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 
+0

你在哪里输出oracle.conf? – 2016-02-01 19:07:42

+0

我想它应该是'echo/opt/instantclient_11_2> /etc/ld.so.conf.d/oracle.conf'。 – danielp 2018-02-21 11:39:00

只是通过你的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; 
    } 
} 

如果你有libclntsh.so问题,需要建立从/usr/lib/oracle/11.2/client64/lib libclntsh.so符号链接/usr/lib

我一直有这个问题,我可以通过运行下面的代码解决: 出口LD_LIBRARY_PATH = /选择/ ORACLE/instantclient:$ LD_LIBRARY_PATH

enter image description here

OBS:此代码我保存的配置文件,因为在我总是使用它。 祝你好运。