Lupinus

Re:从零开始的go学习生活(`・ω・´)

0%

[定时任务]

定时任务

什么是crond?

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

定时任务的作用?

1.系统级别的定时任务

  • 临时文件清理

  • 系统信息采集

  • 日志文件切割

2.用户级别的定时任务

  • 定时向互联网同步时间

  • 定时备份系统配置文件

  • 定时备份数据库的数据

定时任务语法

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
[root@localhost ~]# vim /etc/crontab
#定时任务,支持bash命令
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

#语法
写定时任务

30 7 * * * 用户 ls
分 时 日 月 周

/:每分钟
,:和
-:至(2-3,7-8)

注意:定时任务最小单位分钟,无法精确到秒级

定时任务相关命令

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

定时任务练习

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
#每天凌晨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号恰巧又是周日的时候
00 02 14 * 7 ls

#每年的2月14号,恰巧又是周日凌晨两点才执行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点的03分和15分分别执行ls命令
3,15 8-11 */2 * * ls

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

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

定时任务注意事项

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

备份定时任务的内容

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

1
[root@zls ~]# cp /var/spool/cron/root /backup/root_cron

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

1
2
3
4
5
#只要将用户名写入 /etc/cron.deny文件中,则该用户无法使用定时任务
[root@zls ~]# vim /etc/cron.deny
zls
oldboy
abc

定时任务调试规则

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
13
14
15
16
17
18
19
20
21
22
23
24
#1.需要下载时间同步命令
[root@localhost ~]# yum install -y ntpdate
#2.要先测试命令是否可以在命令行执行成功
[root@localhost ~]# ntpdate 时间同步服务器
[root@localhost ~]# ntpdate time1.aliyun.com
#3.编辑定时任务
[root@localhost ~]# crontab -e
#4.写入规则(命令复制刚才执行成功的命令)
* * * * * ntpdate time1.aliyun.com
#5.查找该命令的绝对路径
[root@localhost ~]# which ntpdate
/usr/sbin/ntpdate
#6.完善规则中的命令路径
* * * * * /usr/sbin/ntpdate time1.aliyun.com
#7.根据规定的时间来进行定时任务编写
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com
#8.查看命令是否有输出内容,如果有则扔进黑洞
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
#9.加上规范注释
#Usage: Sync Date By:zls Date:2022/05/10
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
#10.查看定时任务日志
最开始定时任务,每分钟执行一次,写完之后查看日志
[root@localhost ~]# tail -f /var/log/cron

定时任务实战-备份文件

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
需求:每天凌晨3点做一次备份,将备份命令写入一个脚本中
任务:
1.每天备份文件名要求格式:2018-02-20_hostname_etc.tar.gz
2.存放备份内容的目录要求只保留3天的数据
3.在执行计划任务时,不要输出任务信息

#1.备份使用tar命令
1)实现包名加日期需求:date +%F
[root@localhost ~]# cd / && tar zcf `date +%F`_hostname_etc.tar.gz etc
[root@localhost ~]# cd / && tar zcf $(date +%F)_hostname_etc.tar.gz etc
2)实现包名加主机名需求:hostname
[root@localhost ~]# cd / && tar zcf `date +%F`_`hostname`_etc.tar.gz etc
[root@localhost ~]# cd / && tar zcf $(date +%F)_$(hostname)_etc.tar.gz etc
3)直接写在crontab中
[root@localhost ~]# crontab -e
* * * * * /usr/bin/cd / && /usr/bin/tar zcf `date +%F`_`hostname`_etc.tar.gz etc
[root@localhost ~]# tail -f /var/log/cron
#报错
[root@localhost ~]# cat /var/spool/mail/root
/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
4)将命令写入脚本中
[root@localhost ~]# vim backup_etc.sh
#!/bin/bash
bak_dir="/backup"
if [ ! -d /backup ];then
mkdir /backup
fi
cd / && tar zcf /backup/`date +%F`_`hostname`_etc.tar.gz etc
find /backup -type f -mtime -3 | xargs rm -f
[root@localhost ~]# sh backup_etc.sh
5)不输出任务信息
在定时任务中 &>/dev/null
6)编写定时任务
#先在命令行中手动执行一次脚本
#如果没有报错,再编写定时任务
#定时任务,提高频率先每分钟执行一次
[root@localhost ~]# crontab -e
* * * * * /bin/sh /root/backup_etc.sh
##优化脚本内容
#1.不需要输出内容
* * * * * /bin/sh /root/backup_etc.sh &> /dev/null
#2.满足需求中的时间
00 03 * * * /bin/sh /root/backup_etc.sh &> /dev/null
#3.加注释
# Usage:backup etc By roger Data:2011-5-11
00 03 * * * /bin/sh /root/backup_etc.sh &> /dev/null

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

定时任务实战-邮件发送

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
#1.安装发邮件工具mailx
[root@localhost ~]# yum install -y mailx
[root@localhost ~]# echo '123' | mail -s '发给root的邮件' root@localhost
[root@localhost ~]# tail -f /var/spool/mail/root

#2.配置发件人
[root@localhost ~]# vim /etc/mail.rc
#发件人
set from=#你的QQ邮箱
#QQ邮箱使用的邮件协议
set smtp=smtps://smtp.qq.com:465
#发件人账号
set smtp-auth-user=#你的QQ邮箱登录账号
#发件人密码
set smtp-auth-password=#客户端授权码
#认证登录
set smtp-auth=login
#忽略证书
set ssl-verify=ignore
#证书存放目录
set nss-config-dir=/etc/pki/nssdb/

#3.邮箱开启服务,获取客户端授权码
POP3/SMTP服务
IMAP/SMTP服务
授权码:rffwtpfinrndbdjh/lsytktvegbwobegf

#4.编辑情书
[root@localhost ~]# mkdir qingshu
[root@localhost ~]# vim qingshu1.txt
我很笨,我不知道要怎么表达我心中对你的感觉。
[root@localhost ~]# vim qingshu2.txt
喜欢你的人很多,不缺我一个,但我爱的人很少,只有你一个!
[root@localhost ~]# vim qingshu3.txt
一直想说,无论走到哪里,最想去的是你的身边。
[root@localhost ~]# vim qingshu4.txt
愿我们彼此相爱,一直到时间的尽头
[root@localhost ~]# vim qingshu5.txt
我相信我们可以一起,等青丝变白发
[root@localhost ~]# vim qingshu6.txt
无论岁月如何变迁,我对你的爱曾从不改变

#创建脚本
[root@localhost ~]# vim qingshu.sh
#!/bin/bash
love_dir="/root/qingshu"
love_name=`ls -1 $love_dir | head -1`
echo $love_dir
echo $love_name
cat $love_dir/$love_name |mail -s '发送给roger的邮件' 690705712@qq.com
mv $love_dir/$love_name /tmp

#创建定时任务
[root@localhost ~]# crontab -e
# Usage:send qingshu By roger Date:2022-05-11
* * * * * /bin/sh /root/qingshu.sh &>/dev/null

注意:当文件数为0时会发空邮件

#解决空邮件问题
if [$count -gt 0];then
cat $love_dir/$love_name |mail -s '发送给roger的邮件' 690705712@qq.com
mv $love_dir/$love_name /tmp
fi