2010-04-25 17 views
17

Voglio programmare un'attività su linux tramite 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, ma lievitare l'errore:libclntsh.so.11.1: impossibile aprire il file oggetto condiviso

libclntsh.so.11.1: cannot open shared object file. 

dal momento che è ok per eseguire l'attività da eseguire il comando in guscio come

python a.py  # ok 

cambio il compito in icrontab in uno script di shell che invocano il mio pitone script, ma la recu eccezione Rred?

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

Puoi aiutarmi come si fa?

risposta

15

Forse si desidera specificare PATH - e anche ORACLE_HOME e LD_LIBRARY_PATH - in modo che cron(1) sa dove trovare i binari.
Leggere "5 ambiente Crontab" here.

+0

ma io aggiorno lo script della shell come di seguito: #!/bin/bash echo $ ORACLE_HOME echo $ LD_LIBRARY_PATH e reindirizzare l'output di crontab per registrare il file perché questi percorsi sono stati trovati e registrati per registrare? –

+0

@zhangzhong Suppongo che ti piacerebbe usare 'export' not' echo'? E. g. 'export ORACLE_HOME =/usr/lib/oracle10/foo' e' export LD_LIBRARY_PATH =/usr/lib/bar' –

2

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

Example documentation

1

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 $ directoy $ ORACLE_HOME/lib, dove risiede libclntsh.so, ho finito per risolvere il problema creando collegamenti simbolici da tutte le librerie Oracle xlibx.so in/lib/xlibx .così. Questo non è certamente la soluzione "pulita", ma ha una buona 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 che ho fatto che, cx_Oracle funzionato come un fascino.

+0

L'ho risolto dopo averlo incluso nello script:. ~/.bash_profile –

+0

Da dove hai inserito lo script? –

+0

Tecnicamente funzionerà, ma è la risposta sbagliata, dal momento che la prossima volta che si aggiorna il client Oracle, ciò può interromperlo (e dovrebbe essere rieseguito). La risposta migliore è quella di correggere lo script che richiede Python/Oracle e impostare correttamente i valori dell'ambiente. –

6

Le librerie sono situati in /u01/app/oracle/product/11.2.0/xe/lib (Per Oracle XE) o similare.

Si dovrebbe aggiungere questo percorso per /etc/ld.so.conf o se questo file mostra solo un include posizione, come in un file separato nella directory /etc/ld.so.conf.d

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

Ovviamente non dimenticare di eseguire ldconfig come ultimo passaggio.

+0

quale contenuto dovrebbe scrivere "oracle.conf"? – Gank

1

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 avuto 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.

funzionava solo dopo che ho messo Oracle libreria condivisa su Linux libreria condivisa

echo /opt/instantclient_11_2 > oracle.conf 
ldconfig 
+0

dove hai inviato oracle.conf a? –

+0

Suppongo che dovrebbe essere "echo/opt/instantclient_11_2>/etc/ld.so.conf.d/oracle.conf'. – danielp

0

Basta passare le variabili di percorso Oracle prima di eseguire qualsiasi script:
Come per Perl si può fare aggiungere di seguito nella all'inizio del vostro 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; 
    } 
} 
1

Se avete problema con libclntsh.so, bisogno di creare link simbolico per libclntsh.so /usr/lib/oracle/11.2/client64/lib-/usr/lib

0

Ho sempre avuto questo problema, posso risolvere eseguendo il codice qui sotto: export LD_LIBRARY_PATH =/opt/oracle/instantclient: $ LD_LIBRARY_PATH

enter image description here

OBS: Questo codice ho salvato nel file di configurazione, perché Lo uso sempre. buona fortuna.

Problemi correlati