admin 管理员组

文章数量: 887069

19

1. 计划任务基本概述

1.1 什么是crond

crond就是计划任务, 类似于我们平时生活中的闹钟, 定点执行.

1.2 为什么要使用crond

crond主要是做一些周期性的任务, 
比如: 凌晨3点定时备份数据.
比如:11点开启网站抢购接口, 12点关闭网站抢购接口.

1.3 计划任务主要分为以下两种使用情况:

 1. 系统级别的定时任务:临时文件清理、系统信息采集、日志文件切割  2. 用户级别的定时任务:定时向互联网同步时间、定时备份系统配置文件、定时备份数据库的数据

2.计划任务时间管理

2.1 Crontab配置文件

Crontab配置文件记录了时间周期的含义
[root@kid ~]# vim /etc/crontab  
# 执行命令的解释器
SHELL=/bin/bash   
# 环境变量 
PATH=/sbin:/bin:/usr/sbin:/usr/bin   
# 邮件发给谁(将执行的结果以邮件的方式发生到指定有户的邮箱) 
MAILTO=root                     
# 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# * 表示任意的(分、时、日、月、周)时间都执行  
# -  表示一个时间范围段, 如5-7点  
# ,  表示分隔时段, 如6,0,4表示周六、日、四  
# /n 表示每隔n单位时间, 如/10 每10分钟  

2.2 时间编写规范

 * * * * *        user-name  command to be executed
-----------------------------------------------
# 每天的凌晨2点整执行 (日期, 月份, 星期为空) 
00 02                     ls     
# 每月的1日的凌晨2点整执行 (月份, 星期为空) 
00 02 1                   ls       
# 每年的2月14日凌晨2点执行 (星期为空) 
00 02 14 2                ls    
# 每周天的凌晨2点整执行  (日期, 月份为空) 
00 02       7             ls    
# 每年的6月周五凌晨2点执行  (日期为空) 
00 02    6  5            ls   
# 每月14日或每周日的凌晨2点都执行 (月份为空) 
00 02 14    7            ls      
# 每年的2月14日或每年2月的周天的凌晨2点执行 
00 02 14 2 7             ls    
# 每天凌晨2点, 每隔10分钟执行一次 
/10  02                  ls    
# 每分钟都执行  ls   
# 每年2月14日的凌晨执行命令  
00 00 14 2               ls  
# 每隔5分钟执行一次  
/5                       ls     
# 每年的1月5月8月凌晨2点执行 
00 02    1,5,8           ls  
# 每月1号到8号凌晨2点执行  
00 02 1-8                ls    
# 每天晚上21:00执行 
0 21                     ls    
# 每月1、10、22日的4:45执行  
45 4 1,10,22             ls 
# 每月1到10日的4:45执行  
45 4 1-10                ls
# 每隔两天的上午8点到11点的第3和第15分钟执行  
3,15 8-11 /2             ls  
# 晚上11点到早上7点之间, 每隔一小时执行  
0 23-7/1                 ls   
# 周一到周五每天晚上21:15执行 
15 21      1-5           ls    

2.3 crontab命令参数

crontab -e: 执行文字编辑器来设定时程表, 内定的文字编辑器是vi
参数含义
-e编辑定时任务
-l查看定时任务
-r删除定时任务
-u指定其他用户

2.4 注意事项

* 1. 在使用crontab命令编辑的时候, *号不能少了, 有五个 * !!!, 否则会报错.
* 2. 给定时任务注释, 写多了太乱不清晰.
* 3. 将需要定期执行的任务写入Shell脚本中, 避免直接使用命令无法执行的情况tar date 
* 4. 定时任务的结尾一定要有&>/dev/null或者将结果追加重定向>>/tmp/date.log文件  
* 5. 注意有些命令是无法成功执行的 echo “123” >>/tmp/test.log &>/dev/null 新版本可以
* 6. 如果一定要是用命令, 命令必须使用绝对路径

2.5 crond备份

* 1. 通过查找/var/log/cron中执行的记录, 去推算任务执行的时间  
[root@kid ~]# ll /var/log/cron
-rw-------. 1 root root 12543 Sep 11 21:12 /var/log/cron
[root@kid ~]# cat /var/log/cron
...
Sep 11 21:02:01 kid CROND[2085]: (root) CMD (ls)
Sep 11 21:04:01 kid CROND[2095]: (root) CMD (ls)
Sep 11 21:06:02 kid CROND[2104]: (root) CMD (ls)
Sep 11 21:08:01 kid CROND[2114]: (root) CMD (ls)
...
* 2. 定时的备份/var/spool/cron/{usernmae}
[root@kid ~]# ll /var/spool/cron/root
-rw-------. 1 root root 253 Sep 11 21:11 /var/spool/cron/root
[root@kid ~]# cat /var/spool/cron/root
HELL=/bin/bash
# 环境变量
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# 邮件发给谁(将执行的结果以邮件的方式发生到指定有户的邮箱)
MAILTO=root
# 每天的下午3,5点, 每隔半小时执行一次ls命令
*/2 *20,21 * * *  ls

2.6 crond拒绝某个用户使用

# 1.使用root将需要拒绝的用户加入/etc/cron.deny  
# 文件默认是空的
[root@kid ~]# cat /etc/cron.deny # 限制qq用户的使用
[root@kid ~]# echo "qq" >> /etc/cron.deny 
# 限制xx用户的使用
[root@kid ~]# echo "xx" >> /etc/cron.deny [root@kid ~]# cat /etc/cron.deny 
qq
xx
# 2.登陆该普通用户, 测试是否能编写定时任务  
# 后创建用户一样的
[root@kid ~]# useradd qq  
[root@kid ~]# su - qq
[qq@kid ~]$ crontab -e 
You (qq) are not allowed to use this program (crontab)
See crontab(1) for more information

3.实例

3.1 案例1

使用root用户每5分钟执行一次时间同步
# 1.如何同步时间
# 安装ntpdate
[root@kid ~]# yum  install ntpdate -y# 自动更新时间
[root@kid ~]# ntpdate time.windows.com
11 Sep 19:32:44 ntpdate[1473]: adjust time server 20.189.79.72 offset 0.193178 sec# 2.配置定时任务  (crontab命令会使用vi编辑器)
[root@kid ~]# crontab -e -u root  
# 执行命令的解释器
SHELL=/bin/bash   
# 环境变量 
PATH=/sbin:/bin:/usr/sbin:/usr/bin   
# 邮件发给谁(将执行的结果以邮件的方式发生到指定有户的邮箱) 
MAILTO=root 
# 使用root用户每5分钟执行一次时间同步
*/5 * * * *       ntpdate time.windows.com &>/dev/null# wq 保存并退出
# 出现创建成功的提示
crontab: installing new crontab
# 如果编辑有问题会报错 (第n行有问题)
"/tmp/crontab.iAez82":第n行: bad minute
# 查看任务
[root@kid ~]#  crontab -l -u root
HELL=/bin/bash   
# 环境变量 
PATH=/sbin:/bin:/usr/sbin:/usr/bin   
# 邮件发给谁(将执行的结果以邮件的方式发生到指定有户的邮箱) 
MAILTO=root 
# 使用root用户每5分钟执行一次时间同步
*/5 * * * *      ntpdate time.windows.com
注意: 下列代码将信息丢京黑洞, 邮箱不会有信息
*/5 * * * *      ntpdate time.windows.com &>/dev/null 
# 过5分钟过会在终端出现
You have new mail in /var/spool/mail/root# 安装邮箱
[root@kid ~]# yum -y install mailx# 查看邮件
[root@kid ~]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 1 messages
>N 1 (Cron Daemon) Sun Sep 11 20:47  27/961 "Cron <root@kid> ntpdate tim"
# 输入1查看信息
& 1
...
# 退出邮箱
& q

3.2 案例2

每天的下午3,5点, 每隔半小时执行一次ls命令
# 配置任务
[root@kid ~]# crontab -e -u root  
HELL=/bin/bash
# 环境变量
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# 邮件发给谁(将执行的结果以邮件的方式发生到指定有户的邮箱)
MAILTO=root
# 每天的下午3,5点, 每隔半小时执行一次ls命令
*/30 *3,5 * * *  ls# wq 保存

3.3 案例3

每天凌晨3点做一次备份, 备份/etc/目录到/backup下面
1. 将备份命令写入一个脚本中  
2. 每天备份文件名要求格式: 2022-05-01_hostname_etc.tar.gz  
3. 在执行计划任务时, 不要输出任务信息  
4. 存放备份内容的目录要求只保留三天的数据
# 列出代码
# 1. 创建备份目录
mkdir /backup  
# 创建压缩文件并设置 文件名格式 
tar zcf $(date +%F)_$(hostname)_etc.tar.gz /etc  
# 备份超过三天的备份文件压缩包删除掉
find /backup -name “.tar.gz” -mtime +3 -exec rm -f {};  
# 代码讲解 
# date +%F 获取时间 包含 年 月 日
[root@kid ~]# date +%F
2022-09-11# hostname获取主机名
[root@kid ~]# hostname
kid# $() 括号中执行的命令的结果会替换$()# 查找backup目录下文件名包含 .tar.gz的 指定文件创建时间大于三天的
find /backup -name “.tar.gz” -mtime +3
find 的 -exec参数 后面跟自定义 shell 命令, 标准写法 -exec  shell 命令 ;
{} 表示把查找到的结果发送到此来, 执行rm -f 删除掉
#  将命令写入至一个文件中  
[root@kid ~]# vim /root/back.sh  
mkdir /backup  
tar zcf $(date +%F)_$(hostname)_etc.tar.gz /etc  
find /backup -name “.tar.gz” -mtime +3 -exec rm -f {};  # 配置定时任务  
[root@kid ~]# crontab -l  
00 03    bash /root/back.sh  &>/dev/null  

4. crond计划任务调试

* 1. 调整任务每分钟执行的频率, 以便做后续的调试.  * 2. 如果使用cron运行脚本, 请将脚本执行的结果写入指定日志文件, 观察日志内容是否正常.  * 3. 命令使用绝对路径, 防止无法找到命令导致定时任务执行产生故障.  * 4. 通过查看/var/log/cron日志, 以便检查我们执行的结果, 方便进行调试.

5. crond编写思路

* 1.手动执行命令, 然后保留执行成功的结果.* 2.编写脚本脚本需要统一路径/scripts脚本内容复制执行成功的命令(减少每个环节出错几率)脚本内容尽可能的优化, 使用一些变量或使用简单的判断语句脚本执行的输出信息可以重定向至其他位置保留或写入/dev/null* 3.执行脚本使用bash命令执行, 防止脚本没有增加执行权限(/usr/bin/bash)执行脚本成功后, 复制该执行的命令, 以便写入cron* 4.编写计划任务加上必要的注释信息, 人、时间、任务设定计划任务执行的周期粘贴执行脚本的命令(不要手敲)* 5.调试计划任务增加任务频率测试检查环境变量问题检查crond服务日志

————————————————
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
————————————————

本文标签: 19