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
あなたはそれをどうやってやるのを手伝ってもらえますか?
おそらくcron(1)
がバイナリを見つける場所を知っているように、PATH
—とOracle_HOME
およびLD_LIBRARY_PATH
—を指定することもできます。
「5 Crontab環境」を読む こちら 。
ライブラリは/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を実行することを忘れないでください。
Cronはタスクの実行時にユーザーのプロファイルをロードしないため、シェルスクリプトに明示的にプロファイルを含める必要があります。
Libclntsh.soに問題がある場合は、/usr/lib/Oracle/11.2/client64/lib
から/usr/lib
へのlibclntsh.soのシンボリックリンクを作成する必要があります
先週末、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は魅力のように機能しました。
この投稿は、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
ここに来る他の人の利益のために、最善のことはcx_Oracle
を最新バージョン(6+)に更新することです。このバージョンでは、LD_LIBRARY_PATH
を設定する必要はありません。
すべてのライブラリファイルをインストーラーメディアdatabases/stage/ext/libに$ Oracle_HOME/libにコピーし、問題を解決しました。
スクリプトを実行する前に、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;
}
}
依存関係をインストールする必要がありました
Oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64