Как правильно настроить переменные окружения для скрипта perl в crontab? Сценарий выполняется с обходными путями - PullRequest
2 голосов
/ 10 января 2020

Извините за длинный вопрос, но я немного растерялся, пожалуйста, помогите мне. У меня следующая проблема:

ОС: Red Hat Enterprise Linux Server release 6.6 (Santiago)

Perl: This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi

Модуль, о котором идет речь: DBD::Oracle

Краткое описание:

У меня есть скрипт perl, который прекрасно работает из командной строки. При настройке в crontab следующим образом:

* * * * * \path\to\script.pl

генерируется следующая ошибка:

Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.12.1: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 190.

Пока это то, что я пробовал:

Установка этого блока в начале скрипта - та же ошибка для выполнения crontab.

BEGIN {
    $ENV{'ORACLE_HOME'}='/opt/oracli/app/oracli/product/12.2.0/client_1';
    $ENV{'LD_LIBRARY_PATH'}='/opt/oracli/app/oracli/product/12.2.0/client_1/lib:/lib:/usr/lib';
}

Добавление следующих строк в /home/user/.bash_profile (тот же пользователь crontab)

ORACLE_HOME=/opt/oracli/app/oracli/product/12.2.0/client_1; export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH

Исправление делает строки в /home/user/.bashrc (потому что они там перепутались)

Повторная загрузка обоих .bash_profile & .bashr c

Добавим это в начало моего crontab:

BASH_ENV=/home/user/.bash_profile

Все вышеперечисленное не помогло мне. Мой источник был Google и работал при условии, что я не предоставляю ORACLE_HOME & LD_LIBRARY_PATH.

Когда я запускаю простой скрипт оболочки, который содержит:

#!/bin/sh

ORACLE_HOME=/opt/oracli/app/oracli/product/12.2.0/client_1
export ORACLE_HOME
LD_LIBRARY_PATH=/opt/oracli/app/oracli/product/12.2.0/client_1/lib
export LD_LIBRARY_PATH
/path/to/script.pl

Everythign работает просто отлично так что ...

Пожалуйста, укажите мне, что мне не хватает. Есть ли в linux другой конфигурационный файл для окружения crontab.

Извините за длинный пост, я не просто в ОС.

Редактировать: Извините, я пропустил это - я Я хочу обойти, если возможно, оболочку, экспортирующую переменные, необходимые для вызова perl:

* * * * * \path\to\shell_with_variables.sh

Но чтобы найти, где я могу добавить переменные глобально, чтобы они были видны из выполнения crontab

Спасибо заранее.

Ответы [ 2 ]

4 голосов
/ 10 января 2020

LD_LIBRARY_PATH необходимо установить до запуска программы (perl).


Вы можете использовать

ORACLE_HOME=...
LD_LIBRARY_PATH=...

* * * * * /path/to/script.pl

или

* * * * * ORACLE_HOME=... LD_LIBRARY_PATH=... /path/to/script.pl

Первый устанавливает его для всех заданий cron. Последнее только для этой одной программы.


Третий вариант - исправить среду и перезапустить perl.

BEGIN {
   if (@ARGV && $ARGV[0] eq '!fixed!') {
      shift(@ARGV);
   } else {
      $ENV{ ORACLE_HOME     } = "...";
      $ENV{ LD_LIBRARY_PATH } = "...";
      exec($^X, "--", $0, '!fixed!', @ARGV)
         or die("exec: $!\n");
   }
}
3 голосов
/ 10 января 2020

Вы должны добавить переменные окружения вверху самого файла crontab.

ORACLE_HOME=/opt/oracli/app/oracli/product/12.2.0/client_1
LD_LIBRARY_PATH=/opt/oracli/app/oracli/product/12.2.0/client_1/lib
* * * * * /path/to/script.pl

В качестве альтернативы ...

Как предлагают некоторые другие комментарии, если вы добавляете окружение переменные в ~/.bashrc, cron не будет их подбирать. Однако вы можете использовать оболочку bash для вызова Perl.

#!/bin/bash -l
exec /path/to/script.pl

. Затем ваш файл crontab должен вызывать оболочку вместо программы Perl.

См. также crontab (5) .

...