libclntsh.so.11.1:无法打开共享对象文件。

时间:2010-04-25 13:08:20

标签: oracle shell cron environment-variables

我想通过icrontab在Linux上安排任务,任务是用python编写的,必须导入cx_Oracle模块,所以我在中导出ORACLE_HOMELD_LIBRARY_PATH .bash_profile ,但是 它引发了错误:

  

libclntsh.so.11.1:无法打开共享对象文件。

由于可以通过在shell中发出命令来运行任务,如:

python a.py  # ok

我将icrontab中的任务更改为调用我的Python脚本的shell脚本,但异常重现了吗?

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

你能帮忙怎么做吗?

12 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:7)

libs位于 /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作为最后一步运行。

答案 2 :(得分:3)

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

Example documentation

答案 3 :(得分:1)

上周末,当我需要使用cx_Oracle时,我遇到了同样的问题。在花了很多时间尝试修改LD_LIBRARY_PATH变量以包含$ libACntsh.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就像一个魅力。

答案 4 :(得分:1)

这篇文章帮助我解决了使用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

答案 5 :(得分:1)

如果你有libclntsh.so的问题,需要为/usr/lib/oracle/11.2/client64/lib/usr/lib

创建libclntsh.so的符号链接

答案 6 :(得分: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;
   }
}

答案 7 :(得分:0)

我一直有这个问题,我可以通过运行下面的代码来解决: export LD_LIBRARY_PATH = / opt / oracle / instantclient:$ LD_LIBRARY_PATH

enter image description here

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

答案 8 :(得分:0)

我已将所有库文件从安装程序媒体 databases / stage / ext / lib 复制到 $ ORACLE_HOME / lib ,并解决了该问题。

答案 9 :(得分:0)

为了其他任何人来到这里,最好的办法是将cx_Oracle更新到最新版本(6+)。此版本根本不需要设置LD_LIBRARY_PATH

答案 10 :(得分:0)

我必须安装依赖项

  

oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64

答案 11 :(得分:0)

可能您需要sudo进入使用相关环境设置注册的帐户:)