问题:python代码需要在import cx_Oracle,在docker中使用./zysprProject.py执行没有任何问题,但是当在crontab -e 配置定时任务时:
0 9 * * * /usr/bin/python3 /home/zysprProject.py >> /home/zyspr.log 2>&1
报错:
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客户端,但在docker中已经安装了64位客户端cx_Oracle,并且直接执行是没有问题的,原因是啥呢....
原因如下:
libclntsh.so是OCI客户端运行时库,Oracle如果程序使用了oci读写数据库必定会装载这个库。一般位于你安装的oracle客户端目录下,比如我的位于/usr/local/lib/python3.6/instantclient_11_2
程序运行时会去两个路径下寻找:①/etc/ld.so.conf所列路径下;②当前用户的环境变量LD_LIBRARY_PATH。如果这两个地方都找不到就会报错,说找不到这个库。
crontab有自己的用户账号,和当前用户的环境变量不共享。
所以,我仅对当前用户配置了LD_LIBRARY_PATH,即在/etc/profile中,crontab用户无法访问。
其次,我没有在/etc/ld.so.conf文件中添加Oracle_home(/usr/local/lib/python3.6/instantclient_11_2),所以报错。
解决方法有2种:
第一种:把oracle_home配置到系统环境变量中(/etc/profile)中,
第二种:在/etc/ld.so.conf中添加oracle_home路径(/usr/local/lib/python3.6/instantclient_11_2)。
注意:第二种添加方式如下:
[root@eb77a4aaff3b etc]# vi ld.so.conf
include ld.so.conf.d/*.conf
include /usr/local/lib/python3.6/instantclient_11_2
保存,退出,添加完输入ldconfig使其生效。
[root@eb77a4aaff3b etc]# ldconfig
参考文件:
https://blog.csdn.net/xpy123/article/details/45039213?utm_source=blogxgwz2