解决Oracle缺少动态链接库cannot open shared object file: No such file o;解决 Linux中python脚本执行无问题,配置crontab定时任务报错

本文解决了一个在CronTab环境下Python脚本调用cx_Oracle模块时出现的“libclntsh.so:cannot open shared object file”错误。问题源于CronTab用户环境变量LD_LIBRARY_PATH未配置或/etc/ld.so.conf未包含Oracle客户端路径。提供了解决方案,包括修改环境变量、ld.so.conf文件及刷新ldconfig。

注:该问题的本质是:缺少动态链接库

20181030更:
在另一台服务器再次遇到类似的问题,也是直接执行python脚本无问题,在crontab中报错:

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory

两次的报错信息极为类似,解决方法也相同,根据网络查询的解决方案,如下:
共有三种方案,每种方案都要记得刷新

  • 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边
ln -s /where/you/install/lib/*.so /usr/lib

然后刷新

sudo ldconfig
  • 修改LD_LIBRARY_PATH(在/etc/parofile)
export LD_LIBRARY_PATH=/where/you/install/lib:$LD_LIBRARY_PATH

然后刷新

sudo ldconfig
  • 修改/etc/ld.so.conf
vim /etc/ld.so.conf
add /where/you/install/lib

刷新

sudo ldconfig

问题描述:一段需要import cx_Oracle的python代码,在Linux下直接执行不会报错,但是配置在crontab中执行报错,报错信息如下:

cx_Oracle.DatabaseError:
 DPI-1047: 64-bit Oracle Client library cannot be loaded: 
 "libclntsh.so: cannot open shared object file: No such file or directory". 
 See https://oracle.github.io/odpi/doc/installation.html#linux for help

报错信息是无法找到64位Oracle客户端,然而事实上已经安装64位客户端,并且直接执行不会出现问题。
后来百度了下,原因如下:

libclntsh.so是OCI客户端运行时库,Oracle如果程序使用了oci读写数据库必定会装载这个库。一般位于你安装的oracle客户端目录下,比如我的位于/opt/oracle/instantclient_11_2中。
程序运行时会去两个路径下寻找:①/etc/ld.so.conf所列路径下;②当前用户的环境变量LD_LIBRARY_PATH。如果这两个地方都找不到就会报错,说找不到这个库。
crontab有自己的用户账号,和当前用户的环境变量不共享。

所以,就可以解释了:
首先,我仅对当前用户配置了LD_LIBRARY_PATH,即在~/.bashrc中,crontab用户无法访问。
其次,我没有在/etc/ld.so.conf文件中添加Oracle_home(/opt/oracle/instantclient_11_2)。
因而,最终报错。

解决方法:
解决方法很简单,
要么把oracle_home配置到系统环境变量中(/etc/profile)中,
要么在/etc/ld.so.conf中添加oracle_home路径(/opt/oracle/instantclient_11_2)。

参考资料:
参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值