注:该问题的本质是:缺少动态链接库
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)。
参考资料:
参考链接