什么是计划任务

后台运行,到了预定的时间就会自动执行的任务,前提是:事先手动将计划任务设定好。

运维常见的计划任务

  • 备份数据库 备份日志文件 备份文件夹文件
  • 清空指定文件 清空日志文件
  • 提醒用户 发送邮件

此时就使用到了crond服务

为什么需要crond定时任务

  • crond简单实用
  • 夜间访问量少,适合备份。用定时任务夜间备份方便
  • 备份时间长
  • 任务重复性高
  • 自动化

利用Cron工具解决周期性的,重复性的,自动完成的,需要备份,需要自动化等运维工作。

检查并安装crond

  1. [root@hecs-215335 ~]# rpm -qa | grep cron
  2. cronie-anacron-1.4.11-24.el7_9.x86_64
  3. crontabs-1.11-6.20121102git.el7.noarch
  4. cronie-1.4.11-24.el7_9.x86_64 #定时任务主程序包,提供crond守护进程等工具
  5. rpm -ivh [包] #安装rpm包
  6. rpm -qa #查看全部安装的包
  7. rpm -ql [包] #查看rpm包的安装信息
  8. rpm -qf [包] #查看命令属于的安装包
  9. rpm -e [包] #卸载软件

检查crond服务是否运行

  1. systemctl status crond.service #centos7
  2. service crond status #centos6
  3. ps aux

Crond 定时任务服务应用

  • Cron 定时任务的名称
  • Crond 定时任务的进程名
  • Crontab 管理定时任务命令

Cron是Linux系统中以后台进程模式周期性执行命令或指定程序任务的服务软件名。
Linux系统启动后,cron软件便会启动,对应的进程名字叫做crond,默认是定期(每分钟检查一次)检查系统中是否有需要执行的任务计划,如果有,则按计划进行,好比我们平时用的闹钟。

crond最快是以分钟执行的
如果需求是秒,就不要用crond了,shell更合适

  1. #!/bin/bash
  2. while True
  3. do
  4. echo "过了一秒"
  5. sleep 1
  6. done

Linux定时任务软件

at 定时任务工具,依赖于atd服务,适用于执行一次就结束的调度任务
比如突发任务,某天夜里3点需要临时备份数据可以使用at软件

  1. ps -aux | grep atd #查看atd服务是否运行
  2. 语法
  3. HH:MM
  4. YYYY-mm-dd
  5. noon #正午中午12点
  6. midnight #午夜晚12点
  7. teatime #下午茶时间,下午四点
  8. tomorrow #明天
  9. now+1min #—分钟之后
  10. now+1minutes/hours/days/weeks

用at创建一个定时任务

  1. [root@hecs-215335 ~]# at now+1min
  2. at> touch /tmp/123.txt
  3. at> <EOT> #Ctrl+d 即可退出
  4. #1分钟后执行命令

定时任务与邮件服务

任务计划触发执行后,会通过邮件发送给用户。

邮件服务

  1. 1.检查服务器端口,25号邮件端口是否打开,centos5sendmail,centos67postfix服务
  2. ss -tnl | grep 25
  3. netstat -ntlp | grep 25
  4. 2.发现未启动25端口的话,则需要启动postfix服务,用于发送邮件首先更改postfix配置文件
  5. vim /etc/postfix / main.cf 修改如下参数
  6. inet_interfaces = all
  7. inet_protocols = all
  8. 3.启动postfix服务
  9. systemctl start postfix
  10. 4.stmp pop3 imap4协议

mailx命令

MTA:Mail Transport Agent ,邮件传送代理,也就是postfix服务
MUA: Mail user Agent ,收发邮件的客户端,可以是 foxmail ,也可以是其他客户端
Centos7通过命令mailx发送邮件,通过mail命令是收邮件

  1. mailx -s "hello liao" liao123 #发送一份邮件

image.png

非交互式发邮件

  1. mailx -s "test 123" root < mail.txt #将文件内容发送到邮箱

定时任务Cron实践

向crond进程提交任务的方式与at不同,crond需要读取配置文件,且有固定的文件格式,通过crontab命令管理文件
cron任务分为两类

  • 系统定时任务

crond服务除了会在工祚时查看/var/spool/cron文件夹下的定时任务文件以外,还会查看/etc/cron.d目录以及/etc/anacrontab 下面的文件内容,里面存放每天、每周、每月需要执行的系统任务。

  1. [root@localhost ~]# ls -l /etc/ | grep cron
  2. -rw-------. 1 root root 541 1 14 00:52 anacrontab
  3. drwxr-xr-x. 2 root root 21 2 15 11:13 cron.d #系统定时任务
  4. drwxr-xr-x. 2 root root 57 2 15 11:13 cron.daily #每天的任务
  5. -rw-------. 1 root root 0 1 14 00:52 cron.deny
  6. drwxr-xr-x. 2 root root 22 2 15 11:13 cron.hourly #每小时的任务
  7. drwxr-xr-x. 2 root root 6 6 10 2014 cron.monthly #每个月的任务
  8. -rw-r--r--. 1 root root 451 6 10 2014 crontab #Cron配置文件
  9. drwxr-xr-x. 2 root root 6 6 10 2014 cron.weekly #每周的定时任务
  1. [root@localhost ~]# cat /etc/crontab
  2. SHELL=/bin/bash #指定定时任务使用的解释器
  3. PATH=/sbin:/bin:/usr/sbin:/usr/bin #定时任务命令文件夹
  4. MAILTO=root #执行结果发送邮件给用户
  5. # For details see man 4 crontabs
  6. # Example of job definition:
  7. # .---------------- minute (0 - 59)
  8. # | .------------- hour (0 - 23)
  9. # | | .---------- day of month (1 - 31)
  10. # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
  11. # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
  12. # | | | | |
  13. # * * * * * user-name command to be executed

用户定时任务

当系统管理员(root)或是普通用户(liao)创建了需要定期执行的任务,可以使用crontab命令配置
crond服务在启动时,会每分钟查看/var/spool/cron 路径下以系统用户名命名的定时任务文件,以确定是否有需要执行的任务。

  1. ls -l /var/spool/cron #该文件夹下是每个用户的定时命令文件
  2. cat /var/spool/cron/root #其中就是输入的定时命令
  3. crontab -l #直接查看当前用户的定时任务

crontab命令

crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似

参数 解释 使用示例
-l list 查看定时任务 crontab -l
-e edit 编辑定时任务 建议手动编辑 crontab -e
-i 删除定时任务,提示用户确认删除,避免出错 crontab -i
-r 删除定时任务,移除/var/spool/cron/username 文件 crontab -r
-u 指定用户执行任务,root可以管理普通用户计划任务 crontab -u

用户查看定时任务

  1. crontab -e #编辑用户的定时任务,等于如上命令编辑的是vi /var/spool/cron/root文件
  2. crontab -l #列出用户设置的定时任务,等于cat var/spool/cron/root

检查crond服务是否运行

  1. systemctl is-active crond
  2. ps -ef | grep crond

定时格式

  1. [root@localhost ~]# cat /etc/crontab
  2. SHELL=/bin/bash #指定定时任务使用的解释器
  3. PATH=/sbin:/bin:/usr/sbin:/usr/bin #定时任务命令文件夹
  4. MAILTO=root #执行结果发送邮件给用户
  5. # For details see man 4 crontabs
  6. # Example of job definition:
  7. # .---------------- minute (0 - 59)
  8. # | .------------- hour (0 - 23)
  9. # | | .---------- day of month (1 - 31)
  10. # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
  11. # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
  12. # | | | | |
  13. # * * * * * user-name command to be executed

定时任务符号

  1. crontab任务配置基本格式
  2. * * * * * command
  3. 分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天) 命令
  4. 1列表示分钟159每分钟用*或者*/1表示
  5. 2列表示小时123 (0表示0点)
  6. 3列表示日期131
  7. 4列表示月份112
  8. 5列标识号星期06(0表示星期天)
  9. 6列要运行的命令
  10. (注意:day of monthday of week一般不同时使用)
  11. (注意:day of monthday of week一般不同时使用)
  12. (注意:day of monthday of week一般不同时使用)

时间表示法

  • 特定值:时间点有效取值范围内的值
  • 通配符:某时间点有效范围内的所有值 | 特殊符号 | 含义 | | —- | —- | | | 号,表示”每”的意思,如00 23 cmd表示每月每周每日的23:00整点执行命令 | | - | 减号表示时间范围分隔符,如17-19,代表每天的17、18、19点 | | , | 逗号,表示分隔时段,如30 17,18,19 表示每天的17、18、19的半点执行命令 | | /n | n表示可以整除的数字,每隔n的单位时间,如每隔10分钟表示/10 cmd |

定时任务练习①

  1. 30 8 * * * echo "go to school" #早上8点30去上学
  2. 00 00 * * * echo "go sleep" #晚上12点睡觉
  3. 0-10 10 * * * echo "123123" #每天10点整到10点10分
  4. 3 4,5,6 * * * echo "123123" #每天4 5 6点的3分整
  5. 0 * * * * #每小时执行,每小时的整点执行
  6. 1 2 * * 4 #每周执行,每周四的凌晨2点1分执行
  7. 1 2 3 * * #每月执行,每月的3号的凌晨2点1分执行
  8. 1 2 3 4 * #每年执行,每年的4月份3号的凌晨2点1分执行
  9. 1 2 * * 3,5 #每周三和周五的2点1分执行
  10. * 13,14 * * 6,0 #每周六、周日的下午1点和2点的每一分钟都执行
  11. 0 9-18 * * 1-5 #周一到周五的每天早上9点一直到下午6点的每一个整点(工作日的每个小时整点)
  12. */10 * * * * #每隔10分钟执行一次任务

定时任务练习②

  1. */1 * * * * #每分钟执行命令
  2. 30 3,0 * * * #每天的凌晨3点半,和12点半执行脚本
  3. 0 */6 * * * #每隔6小时,相当于6、12、18、24点的半点时刻,执行脚本
  4. 30 21 * * * /usr/bin/systemctl stop nginx #每天晚上9点30重启nginx
  5. 45 4 1,10 * * #每月的1、10号凌晨4点45执行脚本
  6. 10 1 * * 6,7 #每周六、周日的凌晨1点10分执行命令
  7. */30 18-23 * * * #每天的18点到23点之间,每隔30分钟执行一次
  8. 0 * * * * #每隔一小时执行一次
  9. 0 11 * 4 1-3 #4月份的周一到周三的上午11点执行脚本
  10. 0 7-11*/2 * * * #每天早上7点到上午11点,每2小时运行cmd命令
  11. * 6 * * * #每天6点执行脚本
  12. 0 4 * * 6 #每周六凌晨4:00执行
  13. 5 4 * * 6 #每周六凌晨4:05执行
  14. 40 8 * * * #每天8点40执行
  15. 31 10/2 * * * #每天10点31开始 每2小时重复一次
  16. 0 2 * * 1-5 #每周1到5 2点执行一次
  17. 0 8,9 * * 1-5 #每周1到5 8 9点执行一次
  18. 0 10,16 * * * #每天的10点 16点执行一次