什么是计划任务,计划任务类似于我们平时生活中的闹钟。
在Linux
系统的计划任务服务crond
可以满足周期性执行任务的需求。
crond
进程每分钟会处理一次计划任务, 计划任务主要是做一些周期性的任务目前最主要的用途是定时备份数据
Schedule one-time tasks with at. 一次性调度执行 at
Schedule recurring jobs with cron. 循环调度执行 cron
Schedule recurring system jobs. 所有计划任务执行中的输出都会以邮件的方式发送给指定用户, 除非重定向
//循环调度执行cron 进程每分钟会处理一次计划任务
[root@wangqing ~]# systemctl status crond
[root@wangqing ~]# ps aux |grep crond
root 1201 0.0 0.0 126264 1640 ? Ss 11:15 0:00 /usr/sbin/crond -n
计划任务分以下两种情况:
清理系统缓存
临时文件清理
系统信息采集
日志文件切割
定时同步互联网时间
定时备份系统配置文件
定时备份数据库文件
文件 说明
/etc/crontab //crontab配置文件
/etc/cron.deny //该文件中所列用户不允许使用crontab命令
/var/spool/cron/* //所有用户定时文件都存放此目录,文件以用户名命名
/var/log/cron //定时任务执行后的日志文件,可用来回溯
[root@wangqing ~]# crontab --help
参数 含义 指定示例
-e 编辑crontab文件内容 crontab -e
-l 查看crontab文件内容 crontab -l
-r 删除crontab文件内容 crontab -r (禁用)
-u 管理其他用户的计划任务 crontab -u wangqing -l
注意: crontab {-l -e}实际上就是在操作/var/spool/cron/username
//如何进行计划任务的备份?
crond时间含义
# Example of job definition:
# .---------------- minute (0 - 59) //分钟
# | .------------- hour (0 - 23) //小时
# | | .---------- day of month (1 - 31) //日期
# | | | .------- month (1 - 12) OR jan,feb,mar,apr //月份
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat //星期
# | | | | |
# * * * * * command to be executed
// * 表示任意的(分、时、日、月、周)时间都执行
// - 表示一个时间范围段, 如5-7点
// , 表示分隔时段, 如6,0,4表示周六、日、四
// */n 表示每隔n单位时间, 如*/10 每10分钟
crond编写示例
00 02 * * * command //每天2:00整
00 02 1 * * command //每月1号2:00整
00 02 14 2 * command //每年2月14号2:00整
00 02 * * 7 command //每周日2:00整
00 02 * 6 5 command //每年6月的周五2:00整
00 02 14 * 7 command //每月14号2:00整或每周日2:00整,这两个时间都执行
00 02 14 2 7 command //每年 2 月 14 号 2:00 整 或者 每周日 2:00 整,这两个时间都执行
00 02 * * * command //每天2:00整
* 02 * * * command //每天2:00中的每一分钟 (错误示范)
* * * * * command //每分钟执行 ls
* * 14 2 * command //2月14号的每分钟(错误示范)
*/5 * * * * command //每隔5分钟
00 02 * 1,5,8 * command //每年1,5,8月的每天2:00整
00 02 1-8 * * command //每月1到8号的2:00整
crond书写规范
//1.为计划任务增加必要的注释
[root@wangqing ~]# crontab -l
##time sync
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
//2.规范计划任务执行脚本存放的路径/scripts/
[root@wangqing ~]# crontab -l
##backup www to /backup
30 01 * * * /bin/sh /scripts/www_backup.sh &>/dev/null
//3.执行shell脚本任务前加/bin/sh, 脚本结尾加&>/dev/null
//调试好后应屏蔽debug输出信息,避免产生系统垃圾占用过多inode, 如需输出日志, 可重定向至日志文件
[root@wangqing ~]# crontab -l
####backup www to /backup
30 01 * * * /bin/sh /scripts/www_backup.sh &>/tmp/www_backup.log
[root@wangqing ~]# crontab -e
#每天凌晨切割nginx日志
05 00 * * * /bin/bash -x /scripts/cut_nginx.sh &> /scripts/log/nginx.log
#每天5点备份数据库
00 05 * * * /bin/bash -x /scripts/dump_sql.sh &>/scripts/log/mysql.log
//注意:
1.我们所有的crond服务是运行的程序。而crontab命令是用户用来设置定时规则的命令。
2.crond服务是企业生产工作中常用的重要服务,at很少使用,可以忽略。
3.几乎每个服务器都会用到crond服务。
1.调整任务每分钟执行, 检测是否是否正常, 有些任务不要频繁执行
2.调整系统时间然后在检测任务, 生产不建议直接使用此方式
3.执行脚本, 将脚本执行输出写入指定日志文件, 观察日志内容是否正常
4.注意一些任务命令带来的问题echo “wangqing” >>/tmp/test.log &>/dev/null
5.命令使用绝对路径, 防止无法找到命令导致定时任务执行故障
6.查看/var/log/cron日志进行调试
建议: 将需要定期执行的任务写入脚本中, 建立/scripts目录统一存放脚本, 脚本中命令必须使用绝对路径,手动执行脚本检测输出是否正常, 然后将脚本加入计划任务测试, 测试后无问题将脚本输出写入对应的日志文件中即可。