web-dev-qa-db-ja.com

libclntsh.so.11.1:共有オブジェクトファイルを開けません。

Linuxでicrontabによってタスクをスケジュールしたいのですが、タスクはpythonで書かれており、cx_Oracleモジュールなので、エクスポートしますOracle_HOMEおよびLD_LIBRARY_PATH in 。bash_profile、ただしエラーが発生します:

libclntsh.so.11.1:共有オブジェクトファイルを開けません。

次のようにシェルでコマンドを発行してタスクを実行しても問題ありません。

python a.py  # ok

Icrontabのタスクを、Pythonスクリプトを呼び出すシェルスクリプトに変更しましたが、例外が再発しましたか?

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

あなたはそれをどうやってやるのを手伝ってもらえますか?

22
e.b.white

おそらくcron(1)がバイナリを見つける場所を知っているように、PATH —とOracle_HOMEおよびLD_LIBRARY_PATH —を指定することもできます。
「5 Crontab環境」を読む こちら

17

ライブラリは/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があり、パスを持つファイルは1つだけです。他に何もありません。

もちろん、最後のステップとしてldconfigを実行することを忘れないでください。

7
Dimitri

Cronはタスクの実行時にユーザーのプロファイルをロードしないため、シェルスクリプトに明示的にプロファイルを含める必要があります。

ドキュメントの例

3
Mark

Libclntsh.soに問題がある場合は、/usr/lib/Oracle/11.2/client64/libから/usr/libへのlibclntsh.soのシンボリックリンクを作成する必要があります

1
ol3man

先週末、cx_Oracleを使用する必要があるときに、この同じ問題に遭遇しました。 libclntsh.soが存在する$ Oracle_HOME/lib directoyを含めるようにLD_LIBRARY_PATH変数を変更しようとして多くの時間を費やした後、すべての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は魅力のように機能しました。

1
Jay Taylor

この投稿は、Oracle_fdwを使用したOracleへのPostgreSQLデータベースリンクに関する同様の問題の解決に役立ちました。

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をチェックしました。

Linux共有ライブラリにOracle共有ライブラリを配置した後にのみ機能しました

echo /opt/instantclient_11_2 > Oracle.conf
ldconfig
1

ここに来る他の人の利益のために、最善のことはcx_Oracleを最新バージョン(6+)に更新することです。このバージョンでは、LD_LIBRARY_PATHを設定する必要はありません。

0
JSharm

すべてのライブラリファイルをインストーラーメディアdatabases/stage/ext/lib$ Oracle_HOME/libにコピーし、問題を解決しました。

0
Ritesh Maddala

スクリプトを実行する前に、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;
   }
}
0
Ujjawal Khare

私は常にこの問題を抱えています。以下のコードを実行することで解決できます。export LD_LIBRARY_PATH =/opt/Oracle/instantclient:$ LD_LIBRARY_PATH

enter image description here

OBS:常に使用するため、このコードを構成ファイルに保存しました。がんばろう。

0

依存関係をインストールする必要がありました

Oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64

0
Alberto M