2010-04-25 24 views
17

Quiero programar una tarea en linux por icrontab, y la tarea está escrita en python y tengo que importar el módulo cx_Oracle, así que exporto ORACLE_HOME y LD_LIBRARY_PATH en .bash_profile, pero que elevar el error:libclntsh.so.11.1: no se puede abrir el archivo de objeto compartido

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

Puesto que es bien para ejecutar la tarea de ejecutar el comando en el shell como

python a.py  # ok 

cambio la tarea en icrontab en un script de shell que invocan mi pitón secuencia de comandos, pero la excepción recu rred?

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

¿Podría ayudarnos a hacer con él?

Respuesta

15

Posiblemente desea especificar PATH - y también ORACLE_HOME y LD_LIBRARY_PATH - de manera que cron(1) sabe dónde encontrar los binarios.
Lea "5 entorno Crontab" here.

+0

pero actualizamos el script de shell de la siguiente manera: #!/bin/bash echo $ ORACLE_HOME echo $ LD_LIBRARY_PATH y redirige la salida de crontab al archivo de registro ¿por qué se ha encontrado y escrito esta ruta para iniciar sesión? –

+0

@zhangzhong Supongo que le gustaría usar 'export' no' echo'? E. g. 'exportar ORACLE_HOME =/usr/lib/oracle10/foo' y' export LD_LIBRARY_PATH =/usr/lib/bar' –

2

Cron no carga el perfil del usuario al ejecutar una tarea y debe incluir el perfil explícitamente en su script de shell.

Example documentation

1

me encontré con este mismo problema la semana pasada cuando necesitaba usar cx_Oracle. Después de pasar mucho tiempo tratando de modificar la variable LD_LIBRARY_PATH para incluir el directorio $ ORACLE_HOME/lib, donde reside libclntsh.so, terminé resolviendo el problema creando enlaces simbólicos desde todas las bibliotecas de Oracle xlibx.so en/lib/xlibx .asi que. Esto ciertamente no es la solución "más limpia", pero tiene una buena posibilidad de trabajar sin causar demasiados problemas:

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

Después de que lo hice, cx_Oracle funcionó de maravilla.

+0

Lo he resuelto después de incluirlo en el script:. ~/.bash_profile –

+0

¿De dónde incluiste el script? –

+0

Técnicamente, esto funcionará, pero es la respuesta incorrecta, ya que la próxima vez que actualice el cliente de Oracle, esto puede romperse (y debería volver a ejecutarse). La mejor respuesta es arreglar el script que necesita Python/Oracle y establecer los valores del entorno correctamente. –

6

Las librerías se encuentran en /u01/app/oracle/product/11.2.0/xe/lib (para Oracle XE) o similar.

se debe añadir este camino a /etc/ld.so.conf o si este archivo muestra sólo un incluir la ubicación, como en un archivo separado en el directorio /etc/ld.so.conf.d

He oracle.conf en /etc/ld.so.conf.d, sólo un archivo con la ruta. Nada más.

Por supuesto, no olvide ejecutar ldconfig como último paso.

+0

¿qué contenido debe escribir "oracle.conf"? – Gank

1

Esta publicación me ayudó a resolver un problema similar con un enlace de base de datos PostgreSQL a Oracle usando oracle_fdw.

He instalado oracle_fdw pero cuando intenté CREATE EXTENSION oracle_fdw; que tiene error could not load library libclntsh.so.11.1: cannot open shared object file: No such file or directory.

yo nos registramos $ORACLE_HOME, $PATH y $LD_LIBRARY_PATH.

sólo funcionó después de poner Oracle biblioteca compartida en Linux biblioteca compartida

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

¿dónde sacaste oracle.conf a? –

+0

Supongo que debería ser 'echo/opt/instantclient_11_2>/etc/ld.so.conf.d/oracle.conf'. – danielp

0

sólo tiene que pasar sus variables de ruta de Oracle antes de ejecutar cualquier script:
como por Perl que pueden hacer añadir a continuación en el comienzo de su guión:

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

Si usted tiene problema con libclntsh.so, necesita crear un enlace simbólico para libclntsh.so /usr/lib/oracle/11.2/client64/lib-/usr/lib

0

siempre tengo este problema, puedo solucionar ejecutando el código de abajo: export LD_LIBRARY_PATH =/opt/oracle/instantclient: $ LD_LIBRARY_PATH

enter image description here

OBS: Este código que guarda en el archivo de configuración, ya Yo siempre lo uso buena suerte.

Cuestiones relacionadas