【问题标题】:How to set up envoirment variables for a perl script in crontab properly? Script is executing with workarounds如何在 crontab 中正确设置 perl 脚本的环境变量?脚本正在使用变通方法执行
【发布时间】:2020-04-28 04:32:05
【问题描述】:

抱歉,问题很长,但我有点迷路,请帮帮我。我遇到了以下问题:

操作系统: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 和 .bashrc

在我的 crontab 中添加这个:

BASH_ENV=/home/user/.bash_profile

以上所有都没有帮助我。我的来源是谷歌,假设我没有提供 ORACLE_HOME 和 LD_LIBRARY_PATH。

当我运行一个包含以下内容的简单 shell 脚本时:

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

一切都很好,所以......

请指出我缺少什么。 linux 中是否有针对 crontab 环境的不同配置文件。

对不起,我不只是进入操作系统。

编辑:对不起,我错过了 - 如果可能,我想绕过 shell 导出调用 perl 所需的变量:

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

但是要找到可以全局添加变量的位置,以便它们在 crontab 执行中可见

提前谢谢你。

【问题讨论】:

  • 由 cron 生成的 Shell 具有非常少的环境变量集。我看到你已经部分解决了你的问题。您需要在 crontab 文件本身中设置您在示例 shell 脚本中创建的变量 - 通过预先声明变量或在文件中的某处设置它们。
  • 很抱歉我在帖子中错过了这个。在 crontab 中运行示例 shell 脚本时,一切正常。但如果可能的话,我希望绕过创建调用 perl 脚本的 shell 脚本(由于计划了大量脚本),如果可能,我希望在配置文件中添加环境变量,以提供(使 ENV 变量可见)此用户的 crontab。我将编辑原始帖子。谢谢你的回答。
  • 那是相当老的 Perl 版本。大约(30-10)/2+1=11岁?

标签: linux perl cron environment-variables


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您应该在 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
    

    或者...

    正如其他一些 cmets 所建议的,如果您在 ~/.bashrc 中添加环境变量,cron 将不会拾取它们。但是,您可以使用 bash 包装器来调用您的 Perl。

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

    你的 crontab 文件应该调用包装器而不是你的 Perl 程序。

    另见crontab(5)

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2023-03-03
      • 2021-08-29
      • 2013-10-12
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 2015-09-28
      相关资源
      最近更新 更多