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?
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 .
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.
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.
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
.
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.
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
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.
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.
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;
}
}