risposta-alla-domanda-sullo-sviluppo-web-bd.com

libclntsh.so.11.1: impossibile aprire il file oggetto condiviso.

Voglio pianificare un'attività su Linux da icrontab, e l'attività è scritta in python e devo importare il modulo cx_Oracle, quindi esporto Oracle_HOME e LD_LIBRARY_PATH in .bash_profile , mait genera l'errore:

libclntsh.so.11.1: impossibile aprire il file oggetto condiviso. 

Poiché è corretto eseguire l'attività, emettere il comando in Shell come:

python a.py  # ok

Ho cambiato l'attività in icrontab in uno script Shell che richiama il mio script Python, ma l'eccezione è ricorsa?

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

Potresti aiutare come farlo?

19
e.b.white

Forse si desidera specificare PATH - e anche Oracle_HOME e LD_LIBRARY_PATH - in modo che cron(1) sappia dove trovare i binari.
Leggi "5 Crontab environment" here .

17
Yasir Arsanukaev

Le librerie si trovano in /u01/app/Oracle/product/11.2.0/xe/lib (per Oracle XE) o simili.

Dovresti aggiungere questo percorso a /etc/ld.so.conf o se questo file mostra solo una posizione di inclusione, come in un file separato nella directory /etc/ld.so.conf.d

Ho Oracle.conf in /etc/ld.so.conf.d, solo un file con il percorso. Nient'altro.

Ovviamente non dimenticare di eseguire ldconfig come ultimo passaggio.

7
Dimitri

Cron non carica il profilo dell'utente quando esegue un'attività e devi includere esplicitamente il profilo nello script di Shell.

Documentazione di esempio

3
Mark

Se hai problemi con libclntsh.so, devi creare un collegamento simbolico per libclntsh.so da /usr/lib/Oracle/11.2/client64/lib a /usr/lib

1
ol3man

Mi sono imbattuto in questo stesso problema lo scorso fine settimana quando avevo bisogno di usare cx_Oracle. Dopo aver passato molto tempo a cercare di modificare la variabile LD_LIBRARY_PATH per includere il $ Oracle_HOME/lib directoy, dove risiede libclntsh.so, ho finito per risolvere il problema creando collegamenti simbolici da tutte le librerie Oracle xlibx.so in/lib/xlibx .così. Questa non è certamente la soluzione più "pulita", ma ha buone possibilità di lavorare senza causare troppi problemi:

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

Dopo averlo fatto, cx_Oracle ha funzionato come un incantesimo.

1
Jay Taylor

Questo post mi ha aiutato a risolvere un problema simile con un collegamento del database PostgreSQL a Oracle utilizzando Oracle_fdw.

Ho installato Oracle_fdw ma quando ho provato CREATE EXTENSION Oracle_fdw; ho ottenuto error could not load library libclntsh.so.11.1: cannot open shared object file: No such file or directory. 

Ho controllato $Oracle_HOME, $PATH e $LD_LIBRARY_PATH.

Ha funzionato solo DOPO che ho messo Oracle Shared Library su Linux Shared Library

echo /opt/instantclient_11_2 > Oracle.conf
ldconfig
1

Per il beneficio di chiunque altro venga qui di gran lunga la cosa migliore da fare è aggiornare cx_Oracle all'ultima versione (6+). Questa versione non ha bisogno di LD_LIBRARY_PATH impostato.

0
JSharm

Ho copiato tutti i file di libreria dal supporto di installazione database/stage/ext/lib a $ Oracle_HOME/lib e ha risolto il problema. 

0
Ritesh Maddala

Basta passare le variabili del tuo percorso Oracle prima di eseguire qualsiasi script:
Come per il Perl puoi aggiungere in basso all'inizio del tuo 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

Ho sempre questo problema, posso risolvere eseguendo il seguente codice: Export LD_LIBRARY_PATH =/opt/Oracle/instantclient: $ LD_LIBRARY_PATH

 enter image description here

OBS: questo codice l'ho salvato nel file di configurazione perché lo uso sempre . Buona fortuna.

0