由于万恶的监控,所以布定时脚本是非常必要的。
因此少不了crontab的使用。
由于对crontab的认识不够,在使用的过程中容易产生误区,以下作总结,同仁共殇。
目录:
1. crontab 服务相关
2. crontab编辑和查看
3. crontab 格式
4. crontab没有运行的相关检查
1. 首先,linux的crontab默认是没有开启的,服务相关语句如下(root用户下):
chkconfig | grep cron #先确认一下是否已经安装,如果安装了,服务名称叫什么(非常必要,因此linux中,服务名是crond,suse中为cron)
service cron status #查看服务状态(以suse为例)
service cron restart #重启cron服务
service cron start #启动cron服务
service cron stop #停止cron服务
service cron reload #重新载入配置(实际上我从来没有使用过这个选项)
crontab -l #查看当前用户的crontab
crontab -e #编辑当前用户的crontab(vi模式,都懂的,编辑完ZZ保存或者:wq)
crontab -r #删除当前用户的crontab
crontab -u sam -l #查看用户sam的crontab(root用户下)
crontab -u sam -e #编辑用户sam的crontab(root用户下)
crontab -u sam -r #删除用户sam的crontab(root用户下)
3. crontab 格式:
第1列分钟1~59
第2列小时1~23(0表示子夜)
第3列日1~31
第4列月1~12
第5列星期0~6(0表示星期天)
第6列要运行的命令
这里有crontab文件条目的一些例子(主要比较疑惑的是*/2这种表示方式,这个表示“每2*”,第1列表示每2分钟,第2列表示每2小时……):
30 21 * * * /usr/local/apache/bin/apachectl restart
上面的例子表示每晚的21:30重启apache。
45 4 1,10,22 * * /usr/local/apache/bin/apachectl restart
上面的例子表示每月1、10、22日的4 : 45重启apache。
10 1 * * 6,0 /usr/local/apache/bin/apachectl restart
上面的例子表示每周六、周日的1 : 10重启apache。
0,30 18-23 * * * /usr/local/apache/bin/apachectl restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/apache/bin/apachectl restart
上面的例子表示每星期六的11 : 00 pm重启apache。
* */1 * * * /usr/local/apache/bin/apachectl restart
每一小时重启apache
* 23-7/1 * * * /usr/local/apache/bin/apachectl restart
晚上11点到早上7点之间,每隔一小时重启apache
0 11 4 * mon-wed /usr/local/apache/bin/apachectl restart
每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/apache/bin/apachectl restart
一月一号的4点重启apache
4. crontab没有运行的相关检查:
(1)检查 /usr/lib/cron 目录是否有cron.allow 和 cron.deny文件,至少要有一个,其它用户才能执行crontab服务,建议自己建一个cron.allow文件。
(2)检查一下crontab服务有没有启动,建议重启一下,以防crontab服务卡死。
(3)使用* * * * * date >> /home/sam/test.txt 条目测试是不是每分钟都放test.txt 写系统日期。如果有,crontab就正常运行,如果没有,参照上述解决方式。
(4)认真检查代码,看能不能运行。
(5)如果执行的是shell,检查脚本是否有加入环境变量的执行语句。(一般都是死在这里,添加内容为:source /home/sam/.profile 或者 source /home/sam/.bath_profile)
(6)如果执行的是perl,检查脚本是否有加入环境变量的执行语句。(死在这里的更多。加入方法见下面模块。)
sub set_env{ #定义子函数
my $user=`whoami`; #获取当前用户名
chomp($user);
my $profile="/home/".$user."/.profile";
if (! -e $profile ){
$profile="/home/".$user."/.bash_profile"
}
open(NEWENV, ". $profile && env|"); #打开环境变量.profile
while($line=<NEWENV>){
if ($line=~/(\w+)=(.*)/){ #正则表达式肢解.profile内容
$ENV{$1}="$2"; # $ENV{PATH}=/home/sam/bin:PATH 这个就是perl里面定义环境变量的语法
}
}
close NEWENV;
}
set_env; #执行函数
(7)另外,检查操作系统时间、检查脚本是否是有x权限等就不再赘述了。
后记:crontab执行的时候如果有报错,就会发个mail给你,提示你:You have new mail in /var/mail/sam
你cat查看一下,就知道脚本怎么错了。98%是环境变量没有配(一般就是指Oracle的HOME、SID等内容)