定时任务crond

1
2
3
4
5
#什么是crond
crond就是计划任务,类似于我们平时生活中的闹钟,定点执行。

[root@localhost ~]# ps aux|grep crond
root 6349 0.0 0.1 126284 1612 ? Ss 16:00 0:00 /usr/sbin/crond -n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#free 查看内存情况
[root@lb01 ~]# free -m(以m显示内存多少)
总内存 已使用 空闲 可使用内存
total used free shared buff/cache available
Mem: 972 89 760 7 123 737
Swap: 1023 0 1023

#Centos6可使用内存
[root@localhost ~]# free
总内存 已使用 空闲
total used free shared buffers cached
Mem: 1004768 170984 833784 220 13336 48440
-/+ buffers/cache: 109208 895560(可使用内存)
Swap: 1048572 0 1048572


#截取需要的内存信息
总内存:free -m|awk '/^Mem/{print $2}'
已使用内存:free -m|awk '/^Mem/{print $3}'
可用内存:free -m|awk '/^Mem/{print $NF}'

#写进脚本
#!/bin/bash
mem_total=`free -m|awk '/^Mem/{print $2}'`
mem_used=`free -m|awk '/^Mem/{print $3}'`
mem_ava=`free -m|awk '/^Mem/{print $NF}'`

echo "------ 内存信息 ------"
echo "总内存:${mem_total}M"
echo "已使用内存:${mem_used}M"
echo "可用内存:${mem_ava}M"

定时任务语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!!定时任务最小只能达到分钟级

## 定时任务配置文件
[root@localhost ~]# cat /etc/crontab
## 定时任务编写的语法
SHELL=/bin/bash
## 可直接执行的命令(以后写在定时任务中的命令,最好加上绝对路径)
PATH=/sbin:/bin:/usr/sbin:/usr/bin
## 定时任务输出的内容,会以邮件的形式发给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
# PATH的作用:是一个环境变量,所有的可执行文件,可以不加路径直接执行
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
* * * * * [用户] 可执行的命令

分 时 日 月 周
00 02 * * * ls # 每天凌晨两点整执行 ls 命令

00 02 1 * * ls # 每月的1号凌晨两点执行 ls 命令

00 02 14 2 * ls # 每年的2月14号凌晨2点执行 ls 命令

00 02 * * 7 ls # 每周周日凌晨2点执行 ls 命令

00 02 * 6 5 ls # 每个6月份的周五凌晨2点执行 ls 命令

00 02 14 * 7 ls # 每个月的14号恰巧是周日时凌晨2点执行 ls 命令

00 02 14 2 7 ls # 每年2月14日恰巧是周日的凌晨2点执行 ls 命令

*/10 02 * * * ls # 每天凌晨2点开始每隔10分钟执行一次 ls 命令

* * * * * ls # 每分钟执行一次ls命令
*/1 * * * * ls # 每分钟执行一次ls命令

00 00 14 2 * ls # 每个2月14日零点执行一次 ls 命令

*/5 * * * * ls # 每隔五分钟执行一次 ls 命令

00 02 * 1,5,8 * ls # 每年的1月5月8月的每天凌晨2点执行一次 ls 命令

00 02 1-8 * * ls # 每个月的1号到8号的凌晨2点执行一次 ls 命令

0 21 * * * ls # 每天晚上9点执行一次 ls 命令
* 21 * * * ls # 每天晚上9点开始每一分钟都执行一次 ls 命令

45 4 1,10,22 * * ls # 每个月的1号 10号 22号的凌晨4点45分执行一次 ls 命令

45 4 1-10 * * ls # 每个月的1号到10号的凌晨4点45分执行一次 ls 命令

3,15 8-11 */2 * * ls # 每隔两天的8点03 8点15 ... 11点03 11点15执行一次 ls 命令

0 23-7/1 * * * ls # 每天的0点到7点和23点到0点整执行一次 ls 命令

15 21 * * 1-5 ls # 每周一到周五晚上9点15分执行一次 ls 命令

crontab命令选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
-e:edit 编辑
-l:查看当前登录用户都有哪些定时任务
-u:指定用户查看定时任务
-r:清空所有定时任务
## 每分钟,同步一下系统时间
[root@localhost ~]# crontab -e
# By: zls Date: 2024-05-06 Name: sync system time
* * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
# 注意:
1)命令绝对路径
2)输出定向到空
3)定时任务加注释
## 每天做备份,将/etc目录打包为:2024-05-06_hostname_etc.tar.gz
[root@web01 /]# cd / && tar zcf /tmp/$(date +%F)_$(hostname -s)_etc.tar.gz etc
[root@web01 ~]# vi /opt/backup.sh
#!/bin/bash
cd / && tar zcf /tmp/$(date +%F)_$(hostname -s)_etc.tar.gz etc

#实时查看定时任务执行结果
[root@lb01 ~]# tail -f /var/log/cron

# 时间格式化输出:

[root@localhost ~]# date +%F-%H:%M:%S
2024-05-13-17:35:25

%F:年月日
%Y:year 年
%m:mouth 月
%d:day 日
%H:hour时
%M:minute分
%S:seconds秒
%A:星期
%w:星期(阿拉伯数字显示)

crontab注意事项

1
2
3
4
5
1) 给定时任务注释
2) 将需要定期执行的任务写入Shell脚本中,避免直接使用命令无法执行的情况tar date
3) 定时任务的结尾一定要有&>/dev/null或者将结果追加重定向>>/tmp/date.log文件
4) 注意有些命令是无法成功执行的 echo "123" >>/tmp/test.log &>/dev/null
5.如果一定要是用命令,命令必须使用绝对路径

定时任务—做备份

1
2
3
4
5
6
7
[root@web01 ~]# ll /var/spool/cron/
total 8
-rw------- 1 root root 165 May 6 11:32 root
-rw------- 1 zls zls 27 May 6 2024 zls

#拒绝用户使用定时任务
[root@web01 ~]# echo 'username' > /etc/cron.deny

计划任务调试思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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服务日志

使用定时任务发邮件

配置邮箱

1
2
3
4
5
6
7
8
9
10
11
12
# 1.安装发送邮件的工具

[root@web01 ~]# yum install -y mailx
# 2.配置邮箱
[root@web01 ~]# vi /etc/mail.rc
set from=邮箱 #发件人
set smtp=smtps://smtp.qq.com:465 #邮箱协议,端口
set smtp-auth-user=邮箱 #登录邮箱账号
set smtp-auth-password=客户端授权码 #邮箱授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

邮箱生成授权码

image-20240506170025656

发邮件

1
2
3
[root@web01 ~]# echo '邮件内容' |mail -s '邮件标题' 3078155561@qq.com
[root@web01 ~]# cat /etc/passwd|mail -s 'test' 3078155561@qq.com
cat /root/backup.log.txt|mail -s '备份文件' 3078155561@qq.com

定时任务实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
需求:将备份命令写入一个脚本中 
1.每天备份文件名要求格式:2018-0220_hostname_etc.tar.gz
2.存放备份内容的目录要求只保留3天的数据
3.在执行计划任务时,不要输出任务信息
4.备份是否成功结果,发送邮件
## 邮件内容:
备份时间:精确到秒
备份文件名:2024-05-06_web01_etc.tar.gz
备份路径:/tmp
是否成功:


vim backup.sh
#!/bin/bash
#找到最近三天文件并打包
find /etc/* -type d -mtime -3|xargs tar zcf /tmp/$(date +%F)_$(hostname -s)_etc.tar.gz
#echo 'Backup Success!!!!'
echo "备份时间:$(date +%Y/%m/%d\ %H:%M:%S)" >>backuplog.txt
echo "备份文件名:$(date +%F)_$(hostname -s)_etc.tar.gz" >>backuplog.txt
echo "备份路径:/tmp" >>backuplog.txt
echo "是否备份成功:是" >>backuplog.txt

#创建定时任务并发邮件
[root@lb01 ~]# crontab -e
# By: lgj Date: 2024-05-06 Name:Backup

0 23 * * * /usr/bin/sh backup.sh &>/dev/null
0 00 * * * /usr/bin/cat /root/backup.log.txt|mail -s '备份文件' 3078155561@qq.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
需求:将备份命令写入一个脚本中
任务:
1.每天备份文件名要求格式:2018-02-20_hostname_etc.tar.gz
2.存放备份内容的目录要求只保留3天的数据
3.在执行计划任务时,不要输出任务信息
4.备份是否成功结果,发送邮件
## 邮件内容:
备份文件名:2024-05-06_web01_etc.tar.gz
备份路径:/tmp
是否成功:

cd / && tar zcf $(date +%F)_$(hostname -s)_etc.tar.gz

find /etc/* -type d -mtime -3

tar zcf /tmp/$(date +%F)_$(hostname -s)_etc.tar.gz /etc/*

find /etc/* -type d -mtime -3|xargs tar zcf /tmp/$(date +%F)_$(hostname -s)_etc.tar.gz