Я пытаюсь подключиться к БД Oracle, используя perl-DBD-Oracle. Мне нужно установить следующие переменные среды:
export LD_LIBRARY_PATH=/home/x/lib/ora10gclient
export TNS_ADMIN=/home/x/lib/ora10gclient
export PATH=/home/x/lib/ora10gclient:/usr/kerberos/bin:/home/x/bin:/home/x/bin64:/usr/local/sbin:/sbin:/usr/sbin:/usr/local/bin:/bin:/usr/bin
export ORACLE_HOME=/home/x/lib/ora10gclient
Этот сценарий выполняется пользователем без головы, и я поместил эти строки в файл .bash_profile для этого пользователя без головы.
Проблема в том, что ssh безглавого пользователя входит в компьютер, на котором запущен этот скрипт, а профиль bash не получен. Поэтому я решил установить эти переменные среды в блоке BEGIN скрипта следующим образом:
BEGIN {
$ENV{'LD_LIBRARY_PATH'} = '/home/x/lib/ora10gclient';
$ENV{'TNS_ADMIN'} = '/home/x/lib/ora10gclient';
$ENV{'PATH'} = '/home/x/lib/ora10gclient:/usr/kerberos/bin:/home/x/bin:/home/x/bin64:/usr/local/sbin:/sbin:/usr/sbin:/usr/local/bin:/bin:/usr/bin';
$ENV{'ORACLE_HOME'} = '/home/x/lib/ora10gclient';
}
Тем не менее, скрипт завершается ошибкой, утверждая, что не может найти Oracle.pm, чего не может делать, когда установлены эти переменные среды.
Я распространил операторы print по всему сценарию, чтобы подтвердить, что он действительно устанавливает переменные окружения. И даже распечатал переменные окружения в строке перед попыткой создать дескриптор для БД (где происходит сбой скрипта) и подтвердил, что они по-прежнему имеют правильные значения.
Я также не порождаю дочерние процессы. Ниже приведена упрощенная версия моего сценария, которая не работает аналогичным образом.
#!/usr/local/bin/perl
use warnings;
use strict;
BEGIN {
$ENV{'LD_LIBRARY_PATH'} = '/home/x/lib/ora10gclient';
$ENV{'TNS_ADMIN'} = '/home/x/lib/ora10gclient';
$ENV{'PATH'} = '/home/x/lib/ora10gclient:/usr/kerberos/bin:/home/x/bin:/home/x/bin64:/usr/local/sbin:/sbin:/usr/sbin:/usr/local/bin:/bin:/usr/bin';
$ENV{'ORACLE_HOME'} = '/home/x/lib/ora10gclient';
}
use DBI;
testConnect();
sub testConnect {
my $orclPort = 1521;
my $orclHost = '<oraclehost>';
my $orclUser = '<user>';
my $srvName = '<servicename>';
my $db = "DBI:Oracle:service_name=$srvName;host=$orclHost;port=$orclPort";
my $orclDBHndl = DBI->connect($db, $orclUser, $orclUser) or die "could not connect: $DBI::errstr\n";
}
Есть идеи, в чем может быть проблема?