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