脚本可以手动运行,但不能在 cron 作业中运行

脚本可以手动运行,但不能在 cron 作业中运行

我使用 perl 脚本在 rrd 中创建系统图表。当我手动运行脚本时,它会更新图表。另一方面,cron 在日志中显示作业已执行,但它不会更新图表。有什么帮助吗?

我已将 apache2 目录权限 root:apache 设置为 770

发行版:CentOs 5.5。

Cron配置:

0,5,10,15,20,25,30,35,40,45,50,55 * * * *       /home/user/graphs/script-rrd.pl  > /dev/null 2>&1

我已经检查过 /var/log/cron,它显示上述脚本已经执行,但它没有更新 /var/html/www/graphs.png 中的图表

该问题的解决方案:

cp -rf /opt/rrdtool-1.4.4/lib/perl/5.8.8/i386-linux-thread-multi/* /usr/lib/perl/site_perl

将 rrd 内容复制到 /usr/lib/perl5/site_perl 中后,问题已解决。

我已经创建了 PERL5LIB。创建 PERL5LIB 后,我可以手动运行脚本,但它不是由 cron 运行的,因此我必须复制上述文件。

SELINUX如下:SELINUX=disabled SELINUXTYPE=targeted SETLOCALDEFS=0

答案1

您的 cron 行中有一个明显的错误:您将错误输出重定向到/dev/null。不要这样做,请查看您的邮件以查看出了什么问题。

cron 作业的一个常见问题是它们获得的环境非常有限:.profile无法读取您的脚本。您可能需要为要运行的脚本定义一些环境变量。

添加:你做了:

cp -rf /opt/rrdtool-1.4.4/lib/perl/5.8.8/i386-linux-thread-multi/* /usr/lib/perl/site_perl

坏主意!你不应该把自己的文件放在里面/usr(外面/usr/local)。那个区域是为包管理器保留的。当然,现在很容易,但你将要明天遇到麻烦(例如当您升级 rrdtool 时),那时调试就会很困难。

相反,按照人们所建议的做,并在脚本(或源~/.profile)中定义必要的环境变量;您需要PERL5LIB(也许其他人也需要)。

答案2

我的第一个猜测是脚本中调用的命令的路径。从 cron 调用时,您无法获得用户的环境设置,因此我建议在脚本中调用的每个命令都指定完整路径。

答案3

crontab 无法识别 shell 变量,因为它是在无 shell 环境下运行的。因此,如果您运行命令,请确保其路径完整。如果您读取或写入文件,请确保也通过完整路径引用它们。

答案4

不相关,但你可以用 */5 替换 00,05,10,15 .. 等 :-)

相关内容