%ENV funktioniert nicht und ich kann shared library
Kann ich nicht verwenden %ENV
var auf meiner Perl-Skript für die Verwendung von Oracle-libs.
BEGIN {
$ORACLE_HOME = "/usr/lib/oracle/10.2.0.3/client64";
$LD_LIBRARY_PATH = "$ORACLE_HOME/lib";
$ORACLE_SID="prod";
$ENV{ORACLE_SID}=$ORACLE_SID;
$ENV{ORACLE_HOME}= $ORACLE_HOME;
$ENV{LD_LIBRARY_PATH}= $LD_LIBRARY_PATH;
};
Wenn ich drucken $ENV{'ORACLE_HOME'}
und $ENV{'LD_LIBRARY_PATH'}
scheint alles ok aber wenn ich mein script habe ich den Fehler:
install_driver(Oracle) failed: Can ' T load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: nicht öffnen können shared object-Datei: Keine solche Datei oder Verzeichnis in /usr/lib64/perl5/DynaLoader.pm line 200.
at (eval 3) Zeile 3
Compilation failed in require at (eval 3) - Linie 3.
Vielleicht eine benötigte shared library oder dll ist nicht installiert, wo erwartet
bei Persistenz.perl Zeile 22
Suche auf der Website, die ich sah, dass der richtige Weg, um env-vars auf Perl ist die Verwendung %ENV
hash.
Exportieren ORACLE_HOME
und LD_LIBRARY_PATH
durch unix-shell (export LD_LIBRARY_PATH=...
) funktioniert es einwandfrei. Irgendwelche Ratschläge?
- Es war eine lange Zeit seit ich hatte auf der Arbeit mit Oracle und Perl, und ich erinnere mich, dass eine der Bibliotheken, die das Perl-Modul nicht installieren, mit der Entwickler installieren. Ich hätte um die Dateien zu extrahieren und ziehen Sie die Bibliothek aus der Datenbank-Paket.
- Aber ist seltsam, denn wenn ich exportieren, die Pfade durch shell, funktioniert es einwandfrei. Scheint nicht ein problem im Zusammenhang mit fehlenden Bibliotheken
- Shell-Skript-wrapper, wie wir das immer getan haben es.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
LD_LIBRARY_PATH
environment-variable gesetzt werden muss, um vor Ihr Programm startet—, bevorperl
selbst geladen wird. Ändern Sie inBEGIN{}
beeinflussen neue Programme, dass Sie beginnen, aber es wird keinen Einfluss auf das laden von shared libraries — in diesem Fall (obwohl ich habe noch nie verwendet, das DBD::Oracle), die Sie laden, eine Oracle -.so
in die bereits Laufenden Programm, so dass es "zu spät" zu ändern, dieLD_LIBRARY_PATH
. Der dynamische linker/lib/ld.so
(oder so) gestartet wird, bevorperl
, so dass durch die Zeit, die Ihr Skript kompiliert undBEGIN{}
läuft, ist es bereits eingerichtet.Du könnte versuchen zu re-exec Ihrem Skript als seinen eigenen Nachfolger oder sowas*, aber ein kurzes shell-Skript ist fast mit Sicherheit die einfachste Lösung:
*- das wäre ein bisschen verrückt, aber TIMTOWTDI:
Habe ich ein paar test-Scripte zu überprüfen, dass die Umwelt gesetzt wird, wenn Sie ändern
%ENV
:Dieser druckt:
das ist, was ich erwartet hatte.
Versuchte ich dann dieses:
erstellt und ein
test.sh
Programm sieht wie folgt aus:In diesem Fall, mein Perl-Skript ausgeführt wird
test.sh
die druckt den Wert der$FOO
Umgebungsvariable gesetzt wurde, in meinem Perl-Skript. Läufttest.pl
ich bekommen:Dies zeigt, dass nicht nur Perl-Einstellung der environment-Variablen, aber es ist auch exportieren von Variablen, so genannte shell-Skripts zur Verfügung zu stellen.
Können Sie versuchen, eine ähnliche Technik zu überprüfen, dass beide
LD_LIBRARY_PATH
undORACLE_HOME
gesetzt werden, bevor Sie verwendet werden. Ich vermute, Sie werden feststellen, dass dies tatsächlich geschieht, sondern dass Ihr Programm immer noch nicht funktioniert, wenn Sie%ENV
.Diese Punkte zu einem Schluss: Festlegen der Umgebung für
LD_LIBRARY_PATH
undORACLE_HOME
auftreten zu spät, um die Zeit, die Ihr Perl-Skript startet. Ich glaube, dass das Betriebssystem untersuchtLD_LIBRARY_PATH
vor Perl beginnt. Ich fand dieses tun eine Suche aufLD_LIBRARY_PATH
:So,
LD_LIBRARY_PATH
ist für dield.so
runtime shared library-loader, Wennld.so
bereits geladen wurde, ändernLD_LIBRARY_PATH
nichts.Fand ich eine ähnliche Diskussion über Perl Monks. Ich bemerkte, dass jemand gefunden erneutes ausführen
env
schien zu funktionieren.Eine Lösung ist, ändern Sie /etc/ld.so.conf
Auf CentOS/RHEL 6.4, Sie konnte erstellen etc/ld.so.conf.d/oracle mit diesem:
Offensichtlich, ändern Sie, wie für Ihre ORACLE_HOME.
Führen
Könnte man die
export
Befehle in den start-up-Skript für unix-shell, die Sie sollten die Erlaubnis haben, zu Bearbeiten. So, die environment-Variablen werden gesetzt, wenn Sie eine neue shell starten und alle Skripte und Programme, die Verwendung von Oracle wird Sie abholen.Ging ich einfach durch etwas ähnliches. Ich hatte, um sicherzustellen, dass die Oracle-Umgebung installiert ist, bevor etwas anderes genannt haben. Stellen Sie sicher, dass die
BEGIN
block vor allen anderen "use" - statements. In meinem Fall, war etwas aufgerufen wird, in Apache ' s httpd.conf-Datei, also musste ich meine setup-Umgebung, anstatt in meinem Paket.BEGIN
block ist vor allem