Il LD_LIBRARY_PATH
la variabile di ambiente deve essere impostata prima il tuo programma si avvia — prima di perl
stesso è caricato. Modificandolo in BEGIN{}
influenzerà i nuovi programmi che avvii, ma non influirà sul caricamento delle librerie condivise — in questo caso (anche se non ho mai usato il DBD::Oracle) stai caricando un Oracle .so
nel programma già in esecuzione, quindi è "troppo tardi" per modificare LD_LIBRARY_PATH
. Il linker dinamico /lib/ld.so
(o giù di lì) viene avviato prima di perl
, quindi quando lo script viene compilato e BEGIN{}
funziona, è già configurato.
Potresti prova a rieseguire il tuo script come suo successore o qualcosa del genere*, ma un breve script di shell sarà quasi sicuramente la soluzione più semplice:
#!/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]"
*- questo sarebbe un po' folle, ma 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;
}