LD_LIBRARY_PATH
proměnná prostředí musí být nastavena před váš program se spustí — před perl
sám je nabitý. Změna v BEGIN{}
ovlivní nové programy které spustíte, ale neovlivní to načítání sdílených knihoven — v tomto případě (ačkoli jsem nikdy nepoužil DBD::Oracle) načítáte Oracle .so
do již běžícího programu, takže na změnu LD_LIBRARY_PATH
je již „příliš pozdě“ . Dynamický linker /lib/ld.so
(nebo tak) se spustí před perl
, takže v době, kdy je váš skript zkompilován, a BEGIN{}
běží, je již nastaven.
Mohli byste zkuste znovu spustit svůj skript jako jeho vlastního nástupce nebo tak něco*, ale krátký shell skript bude téměř jistě tím nejjednodušším řešením:
#!/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]"
*- to by bylo trochu šílené, ale 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;
}