2010-04-25 40 views
17

我想通過icrontab在linux上安排任務,並且任務是用python編寫的,必須導入cx_Oracle模塊,因此我在.bash_profile中導出ORACLE_HOME和LD_LIBRARY_PATH,但 它引發錯誤:libclntsh.so.11.1:無法打開共享目標文件

libclntsh.so.11.1: cannot open shared object file. 

因爲它是確定的問題shell來運行任務的命令一樣

python a.py  # ok 

我改變任務icrontab到一個shell腳本調用我的Python腳本,但例外recu rred?

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

你能幫忙怎麼處理它嗎?

回答

15

可能要指定PATH - 還有ORACLE_HOMELD_LIBRARY_PATH - 以便cron(1)知道在哪裏可以找到二進制文件。
閱讀「5 Crontab環境」here

+0

但我們更新瞭如下的shell腳本: #!/bin/bash echo $ ORACLE_HOME echo $ LD_LIBRARY_PATH 並將crontab的輸出重定向到日誌文件 爲什麼這些路徑被發現並寫入日誌? – 2010-04-25 14:17:59

+0

@zhangzhong我想你想用'export'而不是'echo'? E.例如, 'export ORACLE_HOME =/usr/lib/oracle10/foo'和'export LD_LIBRARY_PATH =/usr/lib/bar' – 2010-04-26 09:36:57

2

在運行任務時,Cron不會加載用戶的配置文件,並且您必須明確地將配置文件包含在shell腳本中。

Example documentation

1

當我需要使用cx_Oracle我碰到了同樣的問題最後一個週末。花費了大量時間嘗試修改LD_LIBRARY_PATH變量以包含libclntsh.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工作就像一個魅力。

+0

我在包含腳本後解決了它:。 〜/ .bash_profile – 2010-04-27 11:20:14

+0

你從哪裏包含腳本? – 2010-04-29 22:59:35

+0

從技術上講,這會起作用,但這是錯誤的答案,因爲下次您更新Oracle客戶端時,可能會中斷(並且需要重新運行)。更好的答案是修復需要Python/Oracle的腳本並正確設置環境值。 – 2010-09-01 22:07:14

6

該庫位於 /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作爲最後一步。

+0

「oracle.conf」應該寫什麼內容? – Gank 2017-08-19 02:23:14

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 
+0

你在哪裏輸出oracle.conf? – 2016-02-01 19:07:42

+0

我想它應該是'echo/opt/instantclient_11_2> /etc/ld.so.conf.d/oracle.conf'。 – danielp 2018-02-21 11:39:00

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; 
    } 
} 
1

如果你有libclntsh.so問題,需要建立從/usr/lib/oracle/11.2/client64/lib libclntsh.so符號鏈接/usr/lib

0

我一直有這個問題,我可以通過運行下面的代碼解決: 出口LD_LIBRARY_PATH = /選擇/ ORACLE/instantclient:$ LD_LIBRARY_PATH

enter image description here

OBS:此代碼我保存的配置文件,因爲在我總是使用它。 祝你好運。

相關問題