1. 定时任务概念
1.1 作用
- 类似生活中的闹钟
- 可以自动完成操作命令
- 定时备份系统里的数据
1.2 定时任务软件种类
1.2.1 定时任务软件 - cronie
企业服务器中使用
1.2.2 定时任务软件 - atd
定时任务只执行一次,一次性定时任务
1.2.3 定时任务软件 - anacron
应用在家用电脑
1.3 检查软件信息
1.3.1 检查是否安装
[root@sec01 ~]# rpm -qa cronie
cronie-1.4.11-19.el7.x86_64
1.3.2 检查软件包含文件
[root@sec01 ~]# rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab
/usr/lib/systemd/system/crond.service
/usr/sbin/crond
/usr/share/doc/cronie-1.4.11
/usr/share/doc/cronie-1.4.11/AUTHORS
/usr/share/doc/cronie-1.4.11/COPYING
/usr/share/doc/cronie-1.4.11/ChangeLog
/usr/share/doc/cronie-1.4.11/INSTALL
/usr/share/doc/cronie-1.4.11/README
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron
1.3.3 检查某个命令属于哪个软件包
[root@sec01 ~]# rpm -qf `which crontab`
cronie-1.4.11-19.el7.x86_64
1.3.4 重点目录及文件
/var/spool/cron/ 定时任务文件目录
1.4 定时任务实现方式
1.4.1 系统定时任务
日志文件需要定期进行切割处理
周一 secure 100M
周二(0:00) mv secure secure-`date +F%` 100M 切割后的文件
touch secure
系统特殊目录
系统定时任务周期:每小时 控制定时任务目录:/etc/cron.hourly
系统定时任务周期:每一天 控制定时任务目录:/etc/cron.daily
系统定时任务周期:每一周 控制定时任务目录:/etc/cron.weekly
系统定时任务周期:每个月 控制定时任务目录:/etc/cron.monthly
1.4.2 用户定时任务
每天的 02:30 进行数据备份
- 用户定时任务查看
crontab -l
- 用户定时任务编辑
crontab -e
- 定时任务配置文件
/var/spool/cron/root root文件表示是root用户设置的定时任务
/var/spool/cron/yunxuan yunxuan文件表示yunxuan用户设置的定时任务
1.4.3 常见提示信息
- 相应用户没有编辑定时任务
[root@sec01 ~]# crontab -l
no crontab for root
- 定时任务编辑错误是否继续
[root@sec01 ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
"/tmp/crontab.CUcPue":1: bad minute
errors in crontab file, can't install.
Do you want to retry the same edit? n
crontab: edits left in /tmp/crontab.CUcPue
2. 定时任务实践应用
2.1 定时任务服务环境准备
确保 crond 服务启动(开机自动启动)
[root@sec01 ~]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-10-20 19:10:11 CST; 12h ago
Main PID: 5996 (crond)
CGroup: /system.slice/crond.service
└─5996 /usr/sbin/crond -n
Oct 20 19:10:11 sec01 systemd[1]: Started Command Scheduler.
Oct 20 19:10:11 sec01 crond[5996]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 44% if used.)
Oct 20 19:10:12 sec01 crond[5996]: (CRON) INFO (running with inotify support)
2.2 定时任务服务应用方法
2.2.1 编写定时任务
配置方法: crontab -e
配置说明,编写规范
[root@sec01 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# 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
# | | | | |
# * * * * * user-name command to be executed
image-20211026181241174.png
编写格式
* * * * * 命令
分 时 日 月 周 执行命令
写法(定时任务最短执行的周期为每分钟)
01. 用数值表示时间信息
00 02 * * * 备份文件
02. 利用特殊符号表示时间信息
* * * * * 备份文件
每分钟 每小时 每天 每月 每周
03. 其他写法
*/5 * * * * -- 每隔5分钟
01-05 02 * * * -- 每天的2点1分至5分,执行5次(指定连续的时间范围)
00 14,20 * * * -- 每天的14点和20点执行(指定不连续的时间范围)
image-20211026182208063.png
2.2.2 编写测试
- 每天 14:30 分钟 学习
30 14 * * * 学习
- 每隔3天 夜里2点 执行数据备份
00 02 */3 * * 数据备份
- 以下配置什么意思(不会这么写)
00/10 01,03 * * *
解析:每天1点和3点 每隔10分钟执行
补充:
20/10 01,03 * * *
01:20 01:30 01:59
03:20 03:30 03:59
- 以下配置什么意思
*/10 01-03 * * *
解析:每天1点至3点 每隔10分钟执行一次
- 以下配置什么意思(不会这么写)
* 01,03 * * *
解析:每天1点和3点的每分钟执行
- 以下配置什么意思(不会这么写)
* 01-03 * * *
解析:每天1点至3点的每分钟执行
- 以下配置什么意思(不会这么写)
00 02 28 */2 6
解析:02:00 每隔两个月的28日 星期六
2.2.3 编写结论
-
在写时间信息的时候,如果想表示每隔多久执行什么任务
*/n 左边尽量用 * 号表示 ,不要写具体数值
时间信息由左到右依次书写,尽量不要跳步
当编写定时任务时,日期信息不要和星期信息同时出现
2.2.4 实际编写
每天凌晨2点备份 /data 目录到 /backup
1. 书写时间信息
00 02 * * *
2. 写完成任务的具体命令
cp -a /data /backup
3. 编写
crontab -e
00 02 * * * cp -a /data /backup
2.2.5 定时任务检查方法
- 检查是否有定时任务配置文件
cat /var/spool/cron/root
- 检查定时任务日志文件
tail -f /var/log/cron
3. 定时任务编写注意事项
3.1 编写定时任务要有注释说明
# backup data crond - yunxuan
* * * * * cp -a /data /backup
3.2 编写定时任务路径信息尽量使用绝对路径
3.3 编写定时任务命令需要采用绝对路径执行
定时任务执行时,识别的PATH信息只有:/usr/bin:/bin
3.4 编写定时任务时,可以将输出到屏幕上的信息保存到黑洞中,避免占用磁盘空间
说明:定时任务中执行命令,如果产生输出到屏幕的信息,都会以邮件的方式告知用户
/var/spool/mail/root 不断变大,占用磁盘block空间
解决方法:将邮件服务关闭
systemctl stop postfix
systemctl disable postfix
关闭邮件服务,会在以下目录中产生大量小文件,占用磁盘空间(inode)
/var/spool/postfix/maildrop/
解决方法:
rm -f /var/spool/postfix/maildrop/*
最终解决方案
* * * * * sh test.sh &>/dev/null
3.5 编写定时任务,尽量不要产生屏幕输出信息
3.6 当需要多个命令完成一个定时任务需求时,可以利用脚本编写定时任务
命令使用绝对路径。脚本和定时任务中的命令均用绝对路径。