1. 程式人生 > >解決Oracle缺少動態連結庫cannot open shared object file: No such file o;解決 Linux中python指令碼執行無問題,配置crontab定時任務報錯

解決Oracle缺少動態連結庫cannot open shared object file: No such file o;解決 Linux中python指令碼執行無問題,配置crontab定時任務報錯

注:該問題的本質是:缺少動態連結庫

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)。

參考資料:
參考連結