什么是crond


crond是一个服务,是定时任务的守护进程

定时任务的作用


1.系统级别的定时任务

临时文件清理 系统信息采集 日志文件切割

2.用户级别的定时任务

定时向互联网同步时间 定时备份系统配置文件 定时备份数据库的数据

定时任务语法


# crontab配置文件解析
015:56:05 root@jinnan,10.0.0.101:~ # vim /etc/crontab

# 定时任务,支持bash命令
SHELL=/bin/bash

# 定时任务只支持直接写一下目录中的命令(建议:定时任务中的命令全部使用绝对路径)
PATH=/sbin:/bin:/usr/sbin:/usr/bin

# 定时任务执行的内容,如果有输出,或者有报错,则通过邮件发给/var/spool/cron/root
用户
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

# 语法
-写定时任务,上来六亲不认先写 五颗星
* * * * * 用户 ls
分 时 日 月 周

# - 表示一个时间范围段, 如5-7点
# , 表示分隔时段, 如6,0,4表示周六、日、四
# /1 表示每隔n单位时间, 如*/10 每10分钟
# 切记:定时任务最小单位分钟,无法精确到秒级

定时任务相关命令


# 命令:crontab

## 选项:
-l:list 列出当前定时任务的列表
-e:edit 编辑定时任务 vim /var/spool/cron/root
-r:remove 删除定时任务(删除全部定时任务)
-u:user 指定定时任务的用户


# 每天凌晨2点执行一次ls命令
00 02 * * * ls >/dev/null
# 每个月1号凌晨2点执行一次ls命令
00 02 1 * * ls
# 每年2月14号的凌晨2点执行一次ls命令
00 02 14 2 * ls
# 每周日的凌晨2点执行一次ls命令
00 02 * * 7 ls
# 每年6月份的每个周五凌晨2点执行一次ls命令
00 02 * 6 5 ls
# 每个月14号并且是周日凌晨2点执行一次ls命令
00 02 14 * 7 ls
# 每年2月14号并且是周日凌晨2点执行一次ls命令
00 02 14 2 7 ls
# 每天凌晨2点,每个10分钟执行一次ls命令
*/10 02 * * * ls
# 每分钟执行一次ls命令
* * * * * ls
# 每年2月14号,00点执行一次ls命令
00 00 14 2 * ls
# 每个5分钟执行一次ls命令
*/5 * * * * ls
# 1月份,5月份和8月份的每天凌晨2点执行一次ls命令
00 02 * 1,5,8 * ls
# 每个月1号到8号的凌晨2点执行一次ls命令
00 02 1-8 * * ls
# 每天晚上的21点执行一次ls命令
0 21 * * * ls
# 每个月的1号、10号和22号的凌晨4点45分执行一次ls命令
45 4 1,10,22 * * ls
# 每个月1号到10号的凌晨4点45分执行一次ls命令
45 4 1-10 * * ls
# 每隔2天8点到11点的3分和15分都执行一次ls命令
3,15 8-11 */2 * * ls
# 每天的1点到7点和23点到24点的整点执行一次ls命令
0 23-7/1 * * * ls
# 每周的周1到周5的21点15分执行一次ls命令
15 21 * * 1-5 ls

实战


需求:每天凌晨3点做一次备份

将备份命令写入到一个脚本

任务:

1.每天备份文件名要求格式:2018-02-20_hostname_etc.tar.gz

2.存放备份内容的目录要求只保留3天的数据

3.在执行计划任务时,不要输出任务信息

# 1.备份使用tar命令
cd / && tar zcf `date +%F`_`hostname`_etc.tar.gz etc

1)实现包名加日期需求:date +%F
cd / && tar zcf `date +%F`_`hostname`_etc.tar.gz etc

2)实现包名加主机名需求:hostname
cd / && tar zcf `date +%F`_`hostname`_etc.tar.gz etc

3)将命令写入脚本中
016:44:57 root@jinnan,10.0.0.101:/ # vim backup_etc.sh
cd / && tar zcf `date +%F`_`hostname`_etc.tar.gz etc

4)只保留3天的数据
find /backup -type f ! -mtime -3|xargs rm -f

5)不输出任务信息
在定时任务中 &>/dev/null

6)编写定时任务
## 先手动执行一次脚本,在命令行中
016:47:49 root@jinnan,10.0.0.101:~ # sh backup_etc.sh
016:48:05 root@jinnan,10.0.0.101:~ # ll /
total 9960
-rw-r--r--. 1 root root 10179387 May 11 16:48 2022-05-
11_jinnan_etc.tar.gz

## 如果没有报错,再编写定时任务
016:51:26 root@jinnan,10.0.0.101:~ # crontab -e

## 定时任务,提高频率先每分钟执行一次
* * * * * /bin/sh /root/backup_stc.sh

7)优化定时任务内容
# 1.不需要输出内容
* * * * * /bin/sh /root/backup_stc.sh &> /dev/null

# 2.满足需求中的时间
00 03 * * * /bin/sh /root/backup_etc.sh &> /dev/null

# 3.加注释
# Usage: Backup etc By:jin Date:2022/5/11
00 03 * * * /bin/sh /root/backup_etc.sh &> /dev/null

## 注意:脚本中每添加一行内容就测试执行一次
## 优化脚本内容

#!/bin/bash

back_dir="/back_etc"
mkdir -p $back_dir
cd / && tar zcf $back_dir/$(date +%F)_$(hostname)_etc.tar.gz etc
find $bak_dir -type f ! -mtime -3|xargs rm -f

备份定时任务内容


就是备份/var/spool/cron/用户名

017:34:43 root@jinnan,10.0.0.101:~ # cp /var/spool/cron/root
/backup/root_cron

拒绝某个用户使用定时任务


017:35:38 root@jinnan,10.0.0.101:~ # vim /etc/cron.deny
jinnan
lili
## 只要将用户名写入 /etc/cron.deny文件中,则该用户无法使用定时任务

定时任务调试规则


1.crond调试 1) 调整任务每分钟执行的频率, 以便做后续的调试。 
2) 如果使用cron运行脚本,
请将脚本执行的结果写入指定日志文件, 观察日志内容是否正常。
3) 命令使用绝对路径, 防止无
法找到命令导致定时任务执行产生故障。
4) 通过查看/var/log/cron日志,以便检查我们执行的结果,方便进行调试。
2.crond编写思路
1.手动执行命令,然后保留执行成功的结果。
2.编写脚本
-脚本需要统一路径/scripts
-脚本内容复制执行成功的命令(减少每个环节出错几率)
-脚本内容尽可能的优化, 使用一些变量或使用简单的判断语句
-脚本执行的输出信息可以重定向至其他位置保留或写入/dev/null
3.执行脚本
-使用bash命令执行, 防止脚本没有增加执行权限(/usr/bin/bash)
-执行脚本成功后,复制该执行的命令,以便写入cron
4.编写计划任务
-加上必要的注释信息, 人、时间、任务
-设定计划任务执行的周期
-粘贴执行脚本的命令(不要手敲)
5.调试计划任务
-增加任务频率测试
-检查环境变量问题
-检查crond服务日志

Linux发邮件


# 1.安装发邮件工具mailx
yum install -y mailx

# 2.配置发件人
## 发件人
set from=970839586@qq.com
## QQ邮箱使用的邮件协议
set smtp=smtps://smtp.qq.com:465
## 发件人账号
set smtp-auth-user=970839586@qq.com
## 发件人密码
set smtp-auth-password=rvbtybjryibsbcih
## 认证登录
set smtp-auth=login
## 忽略证书
set ssl-verify=ignore
## 证书存放目录
set nss-config-dir=/etc/pki/nssdb/

配置邮箱

定时任务-crond_vim

定时任务-crond_定时任务_02

开启 pop3 和 IMAP 服务

定时任务-crond_vim_03

定时任务-crond_vim_04

# 发送邮件
# echo '123'|mail -s '标题' 邮箱地址

使用定时任务发情书


## 创建情书存放目录
017:57:06 root@jinnan,10.0.0.101:~ # mkdir /love

## 编写情书
017:57:16 root@jinnan,10.0.0.101:~ # vim /love/1.txt
017:58:53 root@jinnan,10.0.0.101:~ # vim /love/2.txt
017:59:21 root@jinnan,10.0.0.101:~ # vim /love/3.txt
017:59:37 root@jinnan,10.0.0.101:~ # vim /love/4.txt
017:59:51 root@jinnan,10.0.0.101:~ # vim /love/5.txt
018:00:05 root@jinnan,10.0.0.101:~ # vim /love/6.txt

## 编写发送情书的脚本
18:02:55 root@jinnan,10.0.0.101:~ # cat /love/1.txt |mail -s '心爱的小姐
' 970839586@qq.com
0 ✓ 18:12:49 root@jinnan,10.0.0.101:~ # vim send_love.sh
#!/bin/bash

love_dir="/love"
love_name=`ls -1 $love_dir/|head -1`
cat $love_dir/$love_name|mail -s '情书' 970839586@qq.com
rm -f $love_dir/love_name

## 编写定时任务
1)测试脚本发送
0 ✓ 18:13:56 root@jinnan,10.0.0.101:~ # /bin/sh /root/send_love.sh

2)编辑定时任务
# Usage: Send Love By: jin Date: 2022/05/11
* * * * * /bin/sh /root/send_love.sh &>/dev/null

3)查看日志


## 判断
#!/bin/bash
love_dir="/love"
love_name=`ls -1 $love_dir/|head -1`
count=`ls -1 /love/|wc -l`
if [ $count -gt 0 ];then
cat $love_dir/$love_name |mail -s '情书' 133411023@qq.com
mv $love_dir/$love_name /tmp
fi