crontab计划任务管理

crontab命令可以设置周期性任务,启用周期性任务时所对应的系统服务为crond,执行该命令会生成一个以用户名命名的配置文件,并自动保存在/var/spool/cron目录中,日志文件在/var/log/cron,配置文件在/etc/crontab,打开计划任务编辑界面(与vim中的操作相同)后通过该界面用户可以自行添加具体的任务配置,每行代表一个记录,每个记录包括6个字段,其格式为

RHEL6基础之十九crontab计划任务管理_ntpdate

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置


参数:

-u  :只有root 才能进行这个任务,也即帮其他用户新建/删除crontab工作调度。

-e :编辑crontab 的工作内容,   一个工作一行来编辑。

-l :查阅crontab 的工作内容,

-r: 删除所有的crontab的内容,若仅要删除一项,请用-e去编辑。

/etc/cron.allow  将可以使用crontab的账号写入其中,如不在其中则用户不能使用。

/etc/cron.deny   将不可以使用的写入其中,若没有记录在里面则可以使用,  优先判别/etc/cron.allow但默认只有/etc/cron.deny

注意:只有在“分钟+小时+日期+月份+星期”都满足的条件下才会执行操作的命令,比如上面的每个月25号的周二、四、六会执行后面的命令,但是这个月的25号是周五,那么今天就不会执行该作业。在计划任务配置记录中的命令建议使用绝对路径,以避免因缺少执行路径而无法执行命令的情况。关于命令的绝对路径,可以使用which命令查找确认。在设置非每分钟都执行的任务时,“分钟”字段也应该填写一个具体的时间数值(如“0”),而不要保留为默认的“*”,否则将会在每分钟执行一次计划任务

eg:

[root@justin cron]# which tar
/bin/tar
[root@justin cron]# crontab -e -u justin  #设置用户justin每个月25号的周一、周三、周五的18:00到22:00每隔2小时使用tar命令自动备份“/etc/httpd”目录。
0 18-22/2 25 * 1,3,5 /bin/tar zcvf httpd.tar.gz /etc/httpd
[root@justin cron]# crontab -l
no crontab for root
[root@justin cron]# crontab -l -u justin
0 18-22/2 25 * 1,3,5 /bin/tar zcvf httpd.tar.gz /etc/httpd
[root@justin cron]# crontab -r -u justin
[root@justin cron]# crontab -l -u justin
no crontab for justin
[root@justin cron]#crontab -e
30  6  *  *  0  ls   指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
30     3      10,20     *     *      ls     每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
25     8-11 *            *     *      ls       每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
*/15   *        *            *     *      ls          每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
30    6      */10         *      *      ls       每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令。 ]

注意,如果用如果命令用到%的话需要用\转义

00 01 * * * mysqldump -u root --password=passwd-d mustang > /root/backups/mustang_$(date +\%Y\%m\%d_\%H\%M\%S).sql



crontab中的任务没有执行

看 /var/log/cron、/var/spool/mail/root这2文件有crontab执行日志的记录,用tail -f /var/log/cron、/var/spool/mail/root 即可查看最近的crontab执行情况。
在 /var/spool/cron/tmp文件中,有croutXXX001864的tmp文件,tail 这些文件就可以看到正在执行的任务了。
如果脚本手动执行没问题,crontab无法执行,大部分是因为crontab没有读取到环境变量所致。

确认给sh文件指定bash环境或者所有命令使用绝对路径

[ -f ~/.bash_profile ] && . ~/.bash_profile
[ -f /etc/profile] &&  . /etc/profile

今天在crontab来删除日志,设置如下

27 5 * * * find /app/apache-tomcat-7.0.61/logs/ -mtime +7 -type f -name "*.*.log" -exec /bin/rm -f {} \;

发现不会执行,在也没看到执行的记录,然后把设置该成如下就成功执行

27 5 * * * /usr/bin/find /app/apache-tomcat-7.0.61/logs/ -mtime +7 -type f -name "*.*.log" -exec /bin/rm -f {} \;

出现中文乱码的问题

手动执行正常,crontab执行后中文成乱码,此问题是因执行定时任务时没有去获取系统的环境变量,导致了中文乱码。在shell脚本开始的时候加下命令:export LANG="en_US.UTF-8"

#!/bin/sh
export LANG="en_US.UTF-8"