web-dev-qa-db-fra.com

libclntsh.so.11.1: impossible d'ouvrir le fichier d'objet partagé.

Je veux planifier une tâche sur Linux avec icrontab, et la tâche est écrite en python et doit importer le module cx_Oracle. J'exporte donc Oracle_HOME et LD_LIBRARY_PATH dans .bash_profile , mais.

libclntsh.so.11.1: impossible d'ouvrir le fichier d'objet partagé. 

Puisqu'il est possible d'exécuter la tâche en lançant la commande dans Shell, procédez comme suit:

python a.py  # ok

Je change la tâche dans icrontab en un script Shell qui appelle mon script Python, mais l'exception est-elle revenue?

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

Pourriez-vous aider comment faire avec cela?

19
e.b.white

Vous souhaitez éventuellement spécifier PATH - ainsi que Oracle_HOME et LD_LIBRARY_PATH - afin que cron(1) sache où trouver les fichiers binaires.
Lisez "5 Environnement Crontab" ici .

17
Yasir Arsanukaev

Les bibliothèques se trouvent dans /u01/app/Oracle/product/11.2.0/xe/lib (pour Oracle XE) ou similaire.

Vous devez ajouter ce chemin à /etc/ld.so.conf ou si ce fichier ne montre qu'un emplacement d'inclusion, comme dans un fichier séparé du répertoire /etc/ld.so.conf.d.

J'ai Oracle.conf dans /etc/ld.so.conf.d, juste un fichier avec le chemin. Rien d'autre.

Bien sûr, n'oubliez pas de lancer ldconfig comme dernière étape.

7
Dimitri

Cron ne charge pas le profil de l'utilisateur lors de l'exécution d'une tâche et vous devez l'inclure explicitement dans votre script Shell.

Exemple de documentation

3
Mark

Si vous avez un problème avec libclntsh.so, vous devez créer un lien symbolique pour libclntsh.so de /usr/lib/Oracle/11.2/client64/lib à /usr/lib.

1
ol3man

J'ai rencontré le même problème le week-end dernier lorsque j'avais besoin d'utiliser cx_Oracle. Après avoir passé beaucoup de temps à essayer de modifier la variable LD_LIBRARY_PATH afin d'inclure le répertoire $ Oracle_HOME/lib, où réside libclntsh.so, j'ai fini par résoudre le problème en créant des liens symboliques à partir de toutes les bibliothèques Oracle xlibx.so dans/lib/xlibx. .alors. Ce n’est certainement pas la solution la plus «propre», mais elle a de bonnes chances de fonctionner sans trop de problèmes:

 cd $Oracle_HOME/lib
 for f in `ls ./*.so*`; do;
   Sudo ln -s $Oracle_HOME/lib/$f /lib/$f 
 done

Après cela, cx_Oracle a fonctionné à merveille.

1
Jay Taylor

Ce message m'a aidé à résoudre un problème similaire avec un lien de base de données PostgreSQL avec Oracle en utilisant Oracle_fdw.

J'ai installé Oracle_fdw mais quand j'ai essayé CREATE EXTENSION Oracle_fdw; j'ai eu error could not load library libclntsh.so.11.1: cannot open shared object file: No such file or directory. 

J'ai vérifié $Oracle_HOME, $PATH et $LD_LIBRARY_PATH.

Cela n'a fonctionné qu'après avoir mis Oracle Shared Library sous Linux Shared Library.

echo /opt/instantclient_11_2 > Oracle.conf
ldconfig
1

Pour le bénéfice de tous ceux qui viennent ici de loin, la meilleure chose à faire est de mettre à jour cx_Oracle avec la dernière version (6+). Cette version n'a pas besoin de LD_LIBRARY_PATH du tout.

0
JSharm

J'ai copié tous les fichiers de la bibliothèque à partir du support d'installation bases de données/stage/ext/lib vers $ Oracle_HOME/lib et le problème a été résolu. 

0
Ritesh Maddala

Il suffit de passer vos variables de chemin Oracle avant d’exécuter des scripts:
Comme pour Perl, vous pouvez ajouter ci-dessous au début de votre script: 

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

J'ai toujours ce problème, je peux le résoudre en exécutant le code suivant: Export LD_LIBRARY_PATH =/opt/Oracle/instantclient: $ LD_LIBRARY_PATH

 enter image description here

OBS: J'ai enregistré ce code dans le fichier de configuration parce que je l'utilise toujours . Bonne chance.

0