linux - 如何在 crontab 中正确设置 perl 脚本的环境变量?脚本正在使用解决方法执行

标签 linux perl cron environment-variables

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

操作系统:Red Hat Enterprise Linux Server 6.6 版(圣地亚哥)

Perl:这是为 x86_64-linux-thread-multi 构建的 perl,v5.10.1 (*)

有问题的模块: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.

到目前为止,这是我尝试过的:

在脚本开始时设置此 block - 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

一切正常,所以...

请指出我遗漏了什么。 crontab 环境在 linux 中是否有不同的配置文件。

很抱歉,这篇文章很长,我不只是对操作系统感兴趣。

编辑:抱歉,我错过了这个 - 如果可能,我想绕过 shell 导出调用 perl 所需的变量:

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

但是要找到我可以在哪里添加全局变量,以便它们在 crontab 执行中可见

提前谢谢你。

最佳答案

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

关于linux - 如何在 crontab 中正确设置 perl 脚本的环境变量?脚本正在使用解决方法执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59683121/

相关文章:

linux - 为什么模块从地址 0xbf000000 开始

perl - 查找列中的唯一值并将唯一值替换为数字

multithreading - Perl 线程 - 从模块调用子例程 (pm)

bash - 在 Bash 中转义双引号和单引号

java - 我如何在 mysql 数据库更新后立即运行脚本(cronjob)

linux - 为什么我不能在汇编中打印数字?

linux - 从命令行参数将变量设置为最后一个参数

linux - 检测 Mongod 的端口何时在脚本中打开

arrays - 使用 perl 动态显示列中的数组内容

java - 如何在 "For Every 1.00 am of Friday"中为 cron 作业指定时间(以毫秒为单位)?