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?
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 .
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.
Cron non carica il profilo dell'utente quando esegue un'attività e devi includere esplicitamente il profilo nello script di Shell.
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
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.
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
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.
Ho copiato tutti i file di libreria dal supporto di installazione database/stage/ext/lib a $ Oracle_HOME/lib e ha risolto il problema.
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;
}
}