programing

%ENV가 작동하지 않으며 공유 라이브러리를 사용할 수 없습니다.

bestprogram 2023. 9. 19. 21:18

%ENV가 작동하지 않으며 공유 라이브러리를 사용할 수 없습니다.

사용할 수 없습니다.%ENV내 Perl 스크립트에서 Oracle libs를 사용하기 위해 var.

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{'ORACLE_HOME'}그리고.$ENV{'LD_LIBRARY_PATH'}모든 것이 괜찮아 보이지만 스크립트를 실행할 때 오류가 발생합니다.

install_driver(Oracle) 실패:모듈 DBD에 대해 '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so '을(를) 로드할 수 없습니다.:Oracle: libclntsh.so .10.1: 공유 개체 파일을 열 수 없습니다./usr/lib64/ perl5/DynaLoader.pm line 200. at (eval 3) line 3에서 해당 파일이나 디렉토리가 없습니다. (eval 3) line 3에서 컴파일이 실패했습니다.필요한 공유 라이브러리 또는 dll이 지속성이 예상되는 곳에 설치되어 있지 않을 수 있습니다.펄 라인 22

하는 올바른 방법은 에서 Perl envars를 입니다.%ENV

ORACLE_HOME그리고.LD_LIBRARY_PATH해()export LD_LIBRARY_PATH=... 올바르게 작동합니다.조언 좀 해주세요.

LD_LIBRARY_PATH프로그램이 시작되기 에 환경 변수를 설정해야 합니다.perl그 자체가 적재되어 있습니다.BEGIN{}시작하는 새 프로그램에는 영향을 미치지만 공유 라이브러리 로드에는 영향을 미치지 않습니다(DBD를 사용한 적은 없지만).:Oracle) 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 "$@"

*- 이건 좀 미친 짓이겠지만, TIMTOWDI:

  eval { 
     use DBD::Oracle foo bar baz; …
  };
  if ($@ =~ /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\n$@\n";
     exec { $0 } $0 => @ARGV;
  }

했습니다를 할 때 하기 위해 몇 했습니다.%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$FOOPerl 스크립트에 설정된 환경 변수. 중인입니다.test.pl알겠습니다.

This is what I got bar-bar

이는 Perl이 환경 변수를 설정하고 있을 뿐만 아니라 해당 변수를 내보내고 있으므로 셸 스크립트가 환경 변수에 액세스할 수 있음을 보여줍니다.

하여 두 할 수 .LD_LIBRARY_PATH그리고.ORACLE_HOME사용하기 전에 설정하고 있습니다. 일이 합니다만을 걸 될 거예요,다.%ENV.

여기서 한 가지 결론이 나옵니다.환경 설정LD_LIBRARY_PATH그리고.ORACLE_HOMEPerl 스크립트가 시작될 때까지 너무 늦게 발생할 수 있습니다.나는 운영체제가 다음을 조사할 것이라고 생각합니다.LD_LIBRARY_PATH펄이 시작되기 전에이것을 발견했어요.LD_LIBRARY_PATH:

LD_LIBRARY_PATH는 런타임 공유 라이브러리 로더(ld.so )에 공유 라이브러리를 검색할 찾을 추가 디렉토리 집합을 제공하도록 설정한 환경 변수입니다.여러 디렉토리를 나열하고 콜론(:)으로 구분할 수 있습니다.이 목록은 지정된 실행 파일에 대한 컴파일된 로더 경로 및 시스템 기본 로더 경로의 기존 목록 앞에 추가됩니다.

그렇게,LD_LIBRARY_PATH을 위한 것입니다.ld.so런타임 공유 라이브러리 로더, 경우ld.so이미 로드되었습니다, 변경 중입니다.LD_LIBRARY_PATH아무것도 하지 않을 겁니다.

펄 몽크스에 대해서도 비슷한 논의를 발견했습니다.누군가가 다시 도망치는 것을 발견한 것이 효과가 있는 것 같습니다.

한 가지 해결책은 /etc/ld.so .conf를 수정하는 것입니다.

CentOS/RHEL 6.4에서는 다음을 사용하여 etc/ld.so .conf.d/ oracle를 만들 수 있습니다.

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

물론 ORACLE_HOME에 맞게 수정합니다.

그다음달리기

ldconfig -v

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

저도 방금 비슷한 일을 겪었습니다.Oracle 환경이 다른 사용자가 요청하기 전에 먼저 설치되었는지 확인해야 했습니다.확인합니다.BEGIN블록은 다른 "사용" 문 앞에 있습니다.제 경우에는 Apache의 httpd.conf 파일에서 무언가가 호출되고 있었기 때문에 패키지 대신 환경을 설정해야 했습니다.

언급URL : https://stackoverflow.com/questions/8657005/env-doesnt-work-and-i-cannot-use-shared-library