linux学习36 任务计划crontab及企业实战应用
一、Linux任务计划,周期性任务执行
1、在未来的某时间点执行一次某任务:at,batch
2、周期性运行某任务:crontab
执行结果:会通过邮件发送给用户。这个邮件服务只运行在本机上。
3、在centos567中邮件服务都是默认开启的,默认监听端口为25
可通过netstat -tnlp 或ss -tnl 查看
[root@node1 ~]# netstat -tnlp |grep 25 tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1075/master tcp6 0 0 ::1:25 :::* LISTEN 1075/master
4、本地电子邮件服务
a、smtp:simple mail transmission protocol。简单邮件传输协议,用于发送邮件但是不用来接收邮件。
b、pop3:Post Office Procotol,邮局协议,3为版本号
Imap4:Internet Mail Access Procotol 互联网邮件访问协议,4为其版本号
c、mail命令
mailx - send and receive Internet mail
MUA:Mail User Agent,用户收发邮件的工具程序
mailx [-s 'SUBJECT'(邮件的标题)] username[@hostname]
邮件正文的生成
(1)、交互式输入;.单独成行可以表示正文结束;Ctrl + d提交亦可
我们现在给centos用户发送一封邮件
[root@localhost ~]# mail -s 'hello centos' centos #回车后输入邮件内容 How are you these days? . #点号表示结束编辑 EOT
现在我们切换到用户centos查看邮件
[root@localhost ~]# su - centos Last login: Sat Feb 22 17:08:13 CST 2020 on pts/0 [centos@localhost ~]$ mail #mail命令不带任何内容表示收邮件 Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/centos": 1 message 1 new >N 1 root Sat Feb 22 17:11 18/636 "hello centos" #N表示新邮件,1表示第一封新邮件 & 1 #按1表示查看第一封邮件 Message 1: From root@localhost.localdomain Sat Feb 22 17:11:24 2020 Return-Path: <root@localhost.localdomain> X-Original-To: centos Delivered-To: centos@localhost.localdomain Date: Sat, 22 Feb 2020 17:11:24 +0800 To: centos@localhost.localdomain Subject: hello centos User-Agent: Heirloom mailx 12.5 7/5/10 Content-Type: text/plain; charset=us-ascii From: root@localhost.localdomain (root) Status: R How are you these days? #这是邮件的内容,上面表示邮件相应的标题 & q #q表示退出 Held 1 message in /var/spool/mail/centos You have mail in /var/spool/mail/centos
(2)、通过输入重定向
现在我们通过centos发送邮件给root,内容为/etc/fstab中的内容
[centos@localhost ~]$ mail -s 'fstab file' root < /etc/fstab [centos@localhost ~]$ exit logout You have mail in /var/spool/mail/root [root@localhost ~]# mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 1 message 1 new >N 1 centos@localhost.loc Sat Feb 22 17:19 28/1071 "fstab file" & 1 Message 1: From centos@localhost.localdomain Sat Feb 22 17:19:57 2020 Return-Path: <centos@localhost.localdomain> X-Original-To: root Delivered-To: root@localhost.localdomain Date: Sat, 22 Feb 2020 17:19:57 +0800 To: root@localhost.localdomain Subject: fstab file User-Agent: Heirloom mailx 12.5 7/5/10 Content-Type: text/plain; charset=us-ascii From: centos@localhost.localdomain Status: R # # /etc/fstab # Created by anaconda on Wed Oct 24 05:18:55 2018 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=7b808363-4f9d-4f63-a543-28928b32c184 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0
(3)、通过管道。我们也可通过管道进行邮件发送
[root@localhost ~]# cat /etc/fstab | mail -s 'to you' centos You have mail in /var/spool/mail/root
二、周期性任务执行
1、at [OPTION]... TIME
a、TIME:
(1)、HH:MM [YYYY-mm-dd]
(2)、noon(中午,即中午十二点),midnight(午夜,即晚上十二点),teatime(午茶时间,即下午四点),tomorrow(即明天)
(3)、now+ #
UNIT:minutes,hours,days,OR weeks
现在我们定义二分钟以后运行ls /var命令
[root@localhost ~]# at now+2min at> ls /var at> <EOT> #使用ctrl + d提交 job 2 at Sat Feb 22 17:35:00 2020 [root@localhost ~]# at -l #查看at任务 2 Sat Feb 22 17:35:00 2020 a root
b、at的作业队列,用单个字母表示,默认都使用a队列
c、常用选项
-l:查看作业队列,相当于atq
-f /PATH/FROM/SOMEFILE:从指定文件中读取作业任务而不是交互式输入
[root@localhost application]# cat at.tasks cat /etc/inittab echo "hello at command" [root@localhost application]# at -f /application/at.tasks now+5min job 3 at Sat Feb 22 17:46:00 2020 [root@localhost application]# atq 3 Sat Feb 22 17:46:00 2020 a root
-d:删除指定的作业,相当于atrm
[root@localhost application]# atq 3 Sat Feb 22 17:46:00 2020 a root [root@localhost application]# at -d 3 [root@localhost application]# atq
-c:查看指定作业的具体内容
-q QUEUE:指明队列;
d、注意:作业执行结果是以邮件发送给提交作业的用户
2、batch命令
batch会让系统自行选择在系统资源较空闲的时间去执行指明的任务;
3、周期性任务计划:cron
a、服务程序:
cronle:主程序包,提供了crond守护进程及相关辅助工具;
b、确保crond守护进程(daemon)处于运行状态。
(1)、centos7查看方式
[root@localhost application]# systemctl status crond.service ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2020-02-22 17:06:27 CST; 51min ago Main PID: 706 (crond) CGroup: /system.slice/crond.service └─706 /usr/sbin/crond -n Feb 22 17:06:27 localhost.localdomain systemd[1]: Started Command Scheduler. Feb 22 17:06:27 localhost.localdomain systemd[1]: Starting Command Scheduler... Feb 22 17:06:27 localhost.localdomain crond[706]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 18% if used.) Feb 22 17:06:27 localhost.localdomain crond[706]: (CRON) INFO (running with inotify support) You have new mail in /var/spool/mail/root
(2)、centos6 查看方式:service crond status
c、向crond提交作业的方式不同于at,它需要使用专用的配置文件,此文件有固定格式,不建议使用文本编辑器直接编辑此文件,要使用crontab命令
d、cron任务分为两类
(1)、系统cron任务:主要用于实现系统自身的维护;
手动编辑:/etc/crontab文件
系统cron的配置格式:
[root@localhost application]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root #邮件发给的用户 # For details see man 4 crontabs #可以通过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
注意:
1)、每一行定义一个周期性任务,共7个字段
* * * * * :定义周期性时间
user-name:运行任务的用户身份
command to be executed:任务
2)、此处的环境变量不同于用户登陆后获取的环境变量,因此,建议命令使用绝对路径,或者自定义PATH环境变量
3)、执行结果邮件发送给MAILTO指定的用户
(2)、用户cron任务:
命令:crontab命令
也可手动编辑文件:/var/spool/cron/USERNAME
注意:
1)、每一行定义一个周期性任务,共6个字段
* * * * * :定义周期性时间
command to be executed:任务
2)、此处的环境变量不同于用户登陆后获取的环境变量,因此,建议命令使用绝对路径,或者自定义PATH环境变量
3)、执行结果邮件发送给当前用户
e、时间表示法
(1)、特定值:
给定时间点有效取值范围内的值;
注意:day of week和 day of month 一般不同时使用;
(2)、*
给定时间点上有效取值范围内的所有值:表示“每...”
1)、每月每周每天每小时的每三分钟执行一次,即每小时的第三分钟
3 * * * * :每小时执行一次;每小时的第三分钟
2)、每周五的四点三分执行一次:表示每周五的四点三分
3 4 * * 5 :每周执行一次;每周5的4点3分
3)、每月的七号的六点五分执行一次
5 6 7 * * :每月执行一次;每月的7号的6点5分
4)、每年的十月九号八点七分执行一次
7 8 9 10 * :每年执行一次;每年的10月9号8点7分
(3)、离散取值:,
在时间点上使用逗号分隔的多个值:#,#,#
1)、每周三和周日的八点九分执行一次
9 8 * * 3,7 :每周三和周日
2)、每周三和周日的8点和20点各执行一次
0 8,20 * * 3,7 :每周三和周日的8点和20点各执行一次。分钟的位置不能用*,如果用了就表示8点和20点的每分钟。
(4)、连续取值:-
在时间点上使用 - 连接开头和结束:#-#
1)、周一到周五的每天的9点到18点执行一次
0 9-18 * * 1-5 :工作时间内的每小时
(5)、在指定时间点上,定义步长:/#,#即步长
1)、每5分钟执行一次某任务
*/5 * * * *
2)、每7分钟执行一次某任务
注意:
i:指定的时间点不能被步长整除时,其意义将不复存在
ii:对crontab来说最小时间单位为“分钟”,想完成“秒级任务”,得需要额外借助其它机制;定义成每分钟任务,而在利用脚本实现在每分钟之内循环执行多次。
4、crontab命令
crontab [-u user] [-l | -r | -e] [-i] [-s]
a、相应选项
-e:编辑任务
-l:列出所有任务
-r:移除所有任务:即删除/var/spool/cron/USERNAME文件
-i:在使用-r选项移除所有任务时提示用户确认
-u user:root 用户可为指定用户管理cron任务
[root@localhost /]# crontab -u centos -e no crontab for centos - using an empty one crontab: installing new crontab You have new mail in /var/spool/mail/root [root@localhost /]# cat /var/spool/cron/centos * * * * * /bin/echo "wohaoshuai" [root@localhost /]# crontab -u centos -l * * * * * /bin/echo "wohaoshuai"
b、注意:运行结果以邮件通知给当前用户;如果拒绝接收邮件
(1)、COMMAND > /dev/null #将正确输出传送至/dev/null
(2)、COMMAND &> /dev/null #将所有的输出传送至/dev/null
c、定义COMMAND时,如果命令中需要用到%,需要对其转义;但放置于单引号中的%不用转义亦可
d、思考:某任务在指定的时间因关机未能执行,下次开机会不会自动执行?
不会!
如果期望某时间因故未能按时执行,下次开机后无论是否到了相应时间点都要执行一次,可使用anacron实现。
课外作业: anacron及其应用
5、练习:
a、每12小时备份一次/etc目录至/backups目录中,保存文件名称格式为“etc-yyyy-mm-dd-hh.tar.xz”
b、每周2、4、7备份/var/log/secure 文件至/logs目录中,文件名格式为“secure-yyyymmdd”
c、每两小时取出当前系统/proc/meminfo文件中S或M开头的行信息追加至/tmp/meminfo.txt文件中