El LD_LIBRARY_PATH
la variable de entorno debe configurarse antes su programa comienza, antes de perl
en sí mismo está cargado. Cambiándolo en BEGIN{}
afectará a nuevos programas que inicie, pero no afectará la carga de bibliotecas compartidas — en este caso (aunque nunca he usado DBD::Oracle) estás cargando un Oracle .so
en el programa que ya se está ejecutando, por lo que es "demasiado tarde" para cambiar el LD_LIBRARY_PATH
. El enlazador dinámico /lib/ld.so
(más o menos) se inicia antes de perl
, por lo que en el momento en que su secuencia de comandos esté compilada y BEGIN{}
se ejecuta, ya está configurado.
podrías intente volver a ejecutar su secuencia de comandos como su propio sucesor o algo así *, pero una breve secuencia de comandos de shell seguramente será la solución más simple:
#!/bin/sh
export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client64/lib
export ORACLE_SID=prod
exec /usr/local/bin/your-db-program "[email protected]"
*- esto sería un poco loco, pero TIMTOWTDI:
eval {
use DBD::Oracle foo bar baz; …
};
if ([email protected] =~ /install_driver\(Oracle\) failed/) {
$ENV{LD_LIBRARY_PATH} .= ':/usr/lib/oracle/10.2.0.3/client64/lib';
$ENV{ORACLE_SID} = 'prod';
warn "Restarting with LD_LIBRARY_PATH reset:\n\[email protected]\n";
exec { $0 } $0 => @ARGV;
}