命令行上的 perl 脚本 运行 但不在 crontab 中
perl script running on command line but not in crontab
这很奇怪,我在 crontab 中有很多类似以下的脚本和所有 运行ning,但在命令 (./load.pl) 行中遵循脚本 运行ning 但不在内部crontab
定时任务表:
0-59/5 * * * * /home/spatel/rrd/load.pl >> /tmp/load.out
备注:
我也尝试了以下方法
0-59/5 * * * * /usr/bin/perl /home/spatel/rrd/load.pl >> /tmp/load.out
0-59/5 * * * * root /usr/bin/perl /home/spatel/rrd/load.pl >> /tmp/load.out
我在某个地方读到 cron 会忽略脚本的换行符结尾,所以我也很在意它
我已将 print
放入脚本并重定向到 /tmp/load.out
我可以在 load.out
中看到 cron 执行时的输出,但不知何故它没有更新 load.rrd
中的数据] 文件。
如果我 运行 像 ./load.pl
这样的命令脚本就可以了!但不在 crontab 中。
我已将 crontab PATH
设置为 root
使用的任何内容。我尝试了所有可能的调试方法,但它不在 cron 中 运行ning。这是我得到这个脚本的地方,crontab 中的所有其他脚本工作文件只有一个有问题:( https://github.com/mmitch/rrd
脚本:
#!/usr/bin/env perl
#
# RRD script to display system load
# 2003,2011 (c) by Christian Garbs <mitch@cgarbs.de>
# Licensed under GNU GPL.
#
# This script should be run every 5 minutes.
#
# *ADDITIONALLY* data aquisition is done externally every minute:
# rrdtool update $datafile N:$( PROCS=`echo /proc/[0-9]*|wc -w|tr -d ' '`; read L1 L2 L3 DUMMY < /proc/loadavg ; echo ${L1}:${L2}:${L3}:${PROCS} )
#
use strict;
use warnings;
#use 5.010;
use RRDs;
# parse configuration file
my %conf;
eval(`/bin/cat /home/spatel/rrd/rrd-conf.pl`);
die $@ if $@;
# set variables
my $datafile = "/home/spatel/rrd/db/load.rrd";
my $picbase = "/var/www/mrtg/rrd/load-";
# global error variable
my $ERR;
# whoami?
my $hostname = `/bin/hostname`;
chomp $hostname;
# generate database if absent
if ( ! -e $datafile ) {
# max 70000 for all values
RRDs::create($datafile,
"--step=60",
"DS:load1:GAUGE:120:0:70000",
"DS:load2:GAUGE:120:0:70000",
"DS:load3:GAUGE:120:0:70000",
"DS:procs:GAUGE:120:0:70000",
"RRA:AVERAGE:0.5:1:120",
"RRA:AVERAGE:0.5:5:600",
"RRA:AVERAGE:0.5:30:700",
"RRA:AVERAGE:0.5:120:775",
"RRA:AVERAGE:0.5:1440:797",
"RRA:MAX:0.5:1:120",
"RRA:MAX:0.5:5:600",
"RRA:MAX:0.5:6:700",
"RRA:MAX:0.5:120:775",
"RRA:MAX:0.5:1440:797",
"RRA:MIN:0.5:1:120",
"RRA:MIN:0.5:5:600",
"RRA:MIN:0.5:6:700",
"RRA:MIN:0.5:120:775",
"RRA:MIN:0.5:1440:797"
);
$ERR=RRDs::error;
die "ERROR while creating $datafile: $ERR\n" if $ERR;
print "created $datafile\n";
}
# data aquisition is done externally every minute:
my @procs = glob '/proc/[0-9]*';
my $file = '/proc/loadavg';
open my $fh, '<', $file or die "Failed to open '$file': $!";
my $load = <$fh>;
my $p = (scalar @procs);
my $l = (join ':', (split ' ', $load)[0..2]);
print "${l}:${p}";
# update rrd
RRDs::update($datafile,
"N:${l}:${p}"
);
$ERR=RRDs::error;
die "ERROR while updating $datafile: $ERR\n" if $ERR;
# draw pictures
foreach ( [3600, "hour"], [86400, "day"], [604800, "week"], [31536000, "year"] ) {
my ($time, $scale) = @{$_};
RRDs::graph($picbase . $scale . ".png",
"--start=-${time}",
'--lazy',
'--imgformat=PNG',
"--title=${hostname} system load (last $scale)",
"--width=$conf{GRAPH_WIDTH}",
"--height=$conf{GRAPH_HEIGHT}",
'--slope-mode',
'--alt-autoscale',
"DEF:load1=${datafile}:load1:AVERAGE",
"DEF:load2=${datafile}:load2:AVERAGE",
"DEF:load3=${datafile}:load3:AVERAGE",
"DEF:procsx=${datafile}:procs:AVERAGE",
"DEF:procminx=${datafile}:procs:MIN",
"DEF:procmaxx=${datafile}:procs:MAX",
'CDEF:procs=procsx,100,/',
'CDEF:procmin=procminx,100,/',
'CDEF:procrange=procmaxx,procminx,-,100,/',
'AREA:procmin',
'STACK:procrange#E0E0E0',
'AREA:load3#000099:loadavg3',
'LINE2:load2#0000FF:loadavg2',
'LINE1:load1#9999FF:loadavg1',
'COMMENT:\n',
'LINE1:procs#000000:processes/100',
);
$ERR=RRDs::error;
die "ERROR while drawing $datafile $time: $ERR\n" if $ERR;
}
更新:
这是脚本的输出:
[root@spatel tmp]# pwd
/tmp
[root@spatel tmp]# /home/spatel/rrd/load.pl
0.15:0.06:0.01:664
很有可能是环境问题。
A "cron" 脚本以默认系统环境(默认 PATH、LANG 等)开始,您的 .profile、.rc 未执行。
因此您需要在脚本中提供程序所需的所有环境变量 PATH 等。这对于纯 perl 脚本来说有点麻烦,所以最好将它包装在一个 shell 脚本中,该脚本设置任何你的“.profile”脚本集。
已解决:
你不会相信问题是如何解决的,我在 crontab
中使用 perl
而不是 /usr/bin/perl
,但我认为最好的做法是在 PATH
中使用完整的 PATH
crontab 但它被证明是错误的,我仍然不知道为什么以及如何?
0-59/5 * * * * perl /home/spatel/rrd/load.pl
这很奇怪,我在 crontab 中有很多类似以下的脚本和所有 运行ning,但在命令 (./load.pl) 行中遵循脚本 运行ning 但不在内部crontab
定时任务表:
0-59/5 * * * * /home/spatel/rrd/load.pl >> /tmp/load.out
备注: 我也尝试了以下方法
0-59/5 * * * * /usr/bin/perl /home/spatel/rrd/load.pl >> /tmp/load.out
0-59/5 * * * * root /usr/bin/perl /home/spatel/rrd/load.pl >> /tmp/load.out
我在某个地方读到 cron 会忽略脚本的换行符结尾,所以我也很在意它
我已将 print
放入脚本并重定向到 /tmp/load.out
我可以在 load.out
中看到 cron 执行时的输出,但不知何故它没有更新 load.rrd
中的数据] 文件。
如果我 运行 像 ./load.pl
这样的命令脚本就可以了!但不在 crontab 中。
我已将 crontab PATH
设置为 root
使用的任何内容。我尝试了所有可能的调试方法,但它不在 cron 中 运行ning。这是我得到这个脚本的地方,crontab 中的所有其他脚本工作文件只有一个有问题:( https://github.com/mmitch/rrd
脚本:
#!/usr/bin/env perl
#
# RRD script to display system load
# 2003,2011 (c) by Christian Garbs <mitch@cgarbs.de>
# Licensed under GNU GPL.
#
# This script should be run every 5 minutes.
#
# *ADDITIONALLY* data aquisition is done externally every minute:
# rrdtool update $datafile N:$( PROCS=`echo /proc/[0-9]*|wc -w|tr -d ' '`; read L1 L2 L3 DUMMY < /proc/loadavg ; echo ${L1}:${L2}:${L3}:${PROCS} )
#
use strict;
use warnings;
#use 5.010;
use RRDs;
# parse configuration file
my %conf;
eval(`/bin/cat /home/spatel/rrd/rrd-conf.pl`);
die $@ if $@;
# set variables
my $datafile = "/home/spatel/rrd/db/load.rrd";
my $picbase = "/var/www/mrtg/rrd/load-";
# global error variable
my $ERR;
# whoami?
my $hostname = `/bin/hostname`;
chomp $hostname;
# generate database if absent
if ( ! -e $datafile ) {
# max 70000 for all values
RRDs::create($datafile,
"--step=60",
"DS:load1:GAUGE:120:0:70000",
"DS:load2:GAUGE:120:0:70000",
"DS:load3:GAUGE:120:0:70000",
"DS:procs:GAUGE:120:0:70000",
"RRA:AVERAGE:0.5:1:120",
"RRA:AVERAGE:0.5:5:600",
"RRA:AVERAGE:0.5:30:700",
"RRA:AVERAGE:0.5:120:775",
"RRA:AVERAGE:0.5:1440:797",
"RRA:MAX:0.5:1:120",
"RRA:MAX:0.5:5:600",
"RRA:MAX:0.5:6:700",
"RRA:MAX:0.5:120:775",
"RRA:MAX:0.5:1440:797",
"RRA:MIN:0.5:1:120",
"RRA:MIN:0.5:5:600",
"RRA:MIN:0.5:6:700",
"RRA:MIN:0.5:120:775",
"RRA:MIN:0.5:1440:797"
);
$ERR=RRDs::error;
die "ERROR while creating $datafile: $ERR\n" if $ERR;
print "created $datafile\n";
}
# data aquisition is done externally every minute:
my @procs = glob '/proc/[0-9]*';
my $file = '/proc/loadavg';
open my $fh, '<', $file or die "Failed to open '$file': $!";
my $load = <$fh>;
my $p = (scalar @procs);
my $l = (join ':', (split ' ', $load)[0..2]);
print "${l}:${p}";
# update rrd
RRDs::update($datafile,
"N:${l}:${p}"
);
$ERR=RRDs::error;
die "ERROR while updating $datafile: $ERR\n" if $ERR;
# draw pictures
foreach ( [3600, "hour"], [86400, "day"], [604800, "week"], [31536000, "year"] ) {
my ($time, $scale) = @{$_};
RRDs::graph($picbase . $scale . ".png",
"--start=-${time}",
'--lazy',
'--imgformat=PNG',
"--title=${hostname} system load (last $scale)",
"--width=$conf{GRAPH_WIDTH}",
"--height=$conf{GRAPH_HEIGHT}",
'--slope-mode',
'--alt-autoscale',
"DEF:load1=${datafile}:load1:AVERAGE",
"DEF:load2=${datafile}:load2:AVERAGE",
"DEF:load3=${datafile}:load3:AVERAGE",
"DEF:procsx=${datafile}:procs:AVERAGE",
"DEF:procminx=${datafile}:procs:MIN",
"DEF:procmaxx=${datafile}:procs:MAX",
'CDEF:procs=procsx,100,/',
'CDEF:procmin=procminx,100,/',
'CDEF:procrange=procmaxx,procminx,-,100,/',
'AREA:procmin',
'STACK:procrange#E0E0E0',
'AREA:load3#000099:loadavg3',
'LINE2:load2#0000FF:loadavg2',
'LINE1:load1#9999FF:loadavg1',
'COMMENT:\n',
'LINE1:procs#000000:processes/100',
);
$ERR=RRDs::error;
die "ERROR while drawing $datafile $time: $ERR\n" if $ERR;
}
更新:
这是脚本的输出:
[root@spatel tmp]# pwd
/tmp
[root@spatel tmp]# /home/spatel/rrd/load.pl
0.15:0.06:0.01:664
很有可能是环境问题。
A "cron" 脚本以默认系统环境(默认 PATH、LANG 等)开始,您的 .profile、.rc 未执行。
因此您需要在脚本中提供程序所需的所有环境变量 PATH 等。这对于纯 perl 脚本来说有点麻烦,所以最好将它包装在一个 shell 脚本中,该脚本设置任何你的“.profile”脚本集。
已解决:
你不会相信问题是如何解决的,我在 crontab
中使用 perl
而不是 /usr/bin/perl
,但我认为最好的做法是在 PATH
中使用完整的 PATH
crontab 但它被证明是错误的,我仍然不知道为什么以及如何?
0-59/5 * * * * perl /home/spatel/rrd/load.pl