2011-12-28 3 views
10

var을 Perl 스크립트에서 Oracle 라이브러리를 사용할 수 없습니다.% ENV가 작동하지 않아 공유 라이브러리를 사용할 수 없습니다.

install_driver(Oracle) failed: Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200. at (eval 3) line 3 Compilation failed in require at (eval 3) line 3. Perhaps a required shared library or dll isn't installed where expected at persistence.perl line 22

웹에서 검색 내가 ENV를 설정하는 올바른 방법은 펄에 바르 보았다 : 나는 $ENV{'ORACLE_HOME'}$ENV{'LD_LIBRARY_PATH'}를 인쇄 할 경우

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; 
}; 

모두 내 스크립트를 실행할 때 오류가 확인을 보이지만 해시는 %ENV입니다. 유닉스 쉘 (export LD_LIBRARY_PATH=...)를 통해 ORACLE_HOMELD_LIBRARY_PATH 내보내기

가 올바르게 작동합니다. 어떤 충고?

+0

필자는 Oracle과 Perl을 사용해 봐야만했기 때문에 오랜 시간이 걸렸습니다. Perl 모듈에 필요한 라이브러리 중 하나는 개발자가 설치하는 것과 함께 설치되지 않는다는 것을 기억합니다. 파일을 추출하고 데이터베이스 패키지에서 라이브러리를 가져와야합니다. –

+0

쉘을 통해 해당 경로를 내 보내면 올바로 작동하기 때문에 이상합니다. 누락 된 라이브러리와 관련된 문제가없는 것 같습니다. – Daniele

+0

쉘 스크립트 래퍼는 우리가 항상 어떻게했는지입니다. –

답변

10

LD_LIBRARY_PATH 환경 변수는 자체가로드되기 전에 프로그램이 시작될 때 전에으로 설정되어야합니다. BEGIN{}에서 변경하면 새로운 프로그램에 영향을 미치지 만 공유 라이브러리로드에 영향을 미치지 않습니다.이 경우 (비록 DBD :: Oracle을 사용한 적이 없지만) 오라클을로드하고 있습니다. 이미 실행중인 프로그램에 .so을 입력하면 LD_LIBRARY_PATH을 "너무 늦게"변경합니다. 동적 링커 /lib/ld.so (또는 그 이상)은 perl 전에 시작되므로 스크립트가 컴파일되고 BEGIN{}이 실행될 때까지 이미 설정되어 있습니다.

당신 자신의 후계자 또는 뭔가 *하지만 짧은 쉘 스크립트는 거의 확실하게 가장 간단한 해결책이 될 것입니다 귀하의 스크립트를 다시 간부 인을 시도 할 수 있습니다 :

#!/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]" 

것은 * -이 될 것이다 좀 미친하지만 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; 
    } 
+0

정말 고마워요. 완벽하게 작동합니다. – Daniele

-1

나는 비슷한 것을 보았습니다. 오라클 환경이 설정되기 전에 다른 환경이 설정되었는지 확인해야했습니다. BEGIN 블록이 다른 "사용"문 앞에 오는지 확인하십시오. 필자의 경우, 아파치의 httpd.conf 파일에서 무엇인가가 호출 되었기 때문에, 대신에 내 환경에 환경을 설정해야했다.

+0

예, 내 'BEGIN' 블록이 모든 것 앞에 있습니다 – Daniele

+0

웹 환경에 있나요? 그렇다면 DBD :: Oracle을 스크립트에로드하기 전에로드하는 것이 가능할 수 있습니다. – gpojd

+0

아니요, 웹 환경에 없습니다. 그것은 쉘에서 실행하는 스크립트입니다. – Daniele

1

난 당신이 %ENV을 변경할 때 환경이 설정되고 있음을 확인하기 위해 몇 가지 테스트 스크립트를 작성
use strict; 
use warnings; 
use feature qw(say); 

BEGIN { 
    my $foo = "bar-bar"; 
    $ENV{FOO} = "$foo"; 
} 

system qq(/bin/echo printing out \$FOO); 

이 출력합니다 :

printing out bar-bar 

내가 기대했던 것입니다.

나는 다음이 시도 :

use strict; 
use warnings; 
use feature qw(say); 

BEGIN { 
    my $foo = "bar-bar"; 
    $ENV{FOO} = "$foo"; 
} 


system qq(./test.sh); 

을이처럼 보이는 test.sh 프로그램 생성 :이 경우

#! /bin/sh 

echo This is what I got: $FOO; 

, 내 Perl 스크립트가 test.sh를 실행하는의 값을 출력하는을 $FOO 내 Perl 스크립트에서 설정 한 환경 변수. test.pl 실행 내가 얻을 :

This is what I got bar-bar 

이뿐만 아니라 펄은 환경 변수를 설정하지만, 그것은 또한 그 변수를 수출되는, 소위 쉘 스크립트가 그들에 액세스 할 수 있는지 보여줍니다.

LD_LIBRARY_PATHORACLE_HOME이 사용되기 전에 유사한 기술을 시도해 볼 수 있습니다. 나는 이것이 실제로 일어나고 있음을 당신이 알게 될 것이라고 생각하지만, %ENV을 설정할 때 당신의 프로그램은 여전히 ​​작동하지 않는다.

다음은 하나의 결론을 나타냅니다. LD_LIBRARY_PATHORACLE_HOME의 환경 설정은 Perl 스크립트가 시작될 때까지 너무 늦게 발생할 수 있습니다. Perl이 시작되기 전에 운영 체제가 LD_LIBRARY_PATH을 검사한다고 생각합니다.

LD_LIBRARY_PATH is an environment variable you set to give the run-time shared library loader (ld.so) an extra set of directories to look for when searching for shared libraries. Multiple directories can be listed, separated with a colon (:). This list is prepended to the existing list of compiled-in loader paths for a given executable, and any system default loader paths.

그래서, LD_LIBRARY_PATHld.so 런타임 공유 라이브러리 로더입니다, ld.so이 이미로드 된 경우, 아무것도하지 않습니다 LD_LIBRARY_PATH 변경 :이 LD_LIBRARY_PATH에 검색을 수행했습니다.

나는 비슷한 질문을 Perl Monks에서 발견했습니다. 누군가 rerunning env이 (가) 작동하는 것으로 보입니다.

0

하나의 솔루션에 CentOS/RHEL 6.4에

/etc/ld.so.conf에 수정하는 것입니다, 당신은이에 등/ld.so.conf.d/오라클을 만들 수 있습니다

/oracle/sw/product/11.2.0/dbhome_1/lib 

분명히 ORACLE_HOME에 맞게 수정하십시오.

그런 다음

ldconfig -v 
0

당신은 당신이 편집 할 수있는 권한이 있어야 당신의 유닉스 쉘의 시작 스크립트에 export 명령을 넣을 수 있습니다 실행합니다. 그렇게하면 환경 변수가 새 쉘을 시작할 때마다 설정되고 오라클을 사용하는 모든 스크립트와 프로그램이이를 선택합니다.