很抱歉问了这么长的问题,但我有点迷路了,请帮帮我。我遇到了以下问题:
操作系统: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/