linux定时任务
linux定时任务
计划任务:后台运行,到了预定时间就会自动执行的任务,前提是:事先手动将计划任务设定好
-
周期性任务执行
-
清空/tmp目录下的内容
-
mysql数据库备份
-
redis数据库备份
需要用到crond服务
检查crond服务相关软件包
[root@xuexi3 ~]# rpm -qa |grep cron
cronie-anacron-1.4.11-23.el7.x86_64
cronie-1.4.11-23.el7.x86_64
crontabs-1.11-6.20121102git.el7.noarch # 定时任务主程序包,提供crond守护进行等工具
[root@xuexi3 ~]# systemctl status crond #查看 crond状态是否在运行
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; vendor preset: enabled)
Active: active (running) since Mon 2022-09-05 09:34:35 n ago
Main PID: 1611 (crond)
Tasks: 1
CGroup: /system.slice/crond.service
└─1611 /usr/sbin/crond -n
Sep 05 09:34:35 xuexi3 systemd[1]: Started Command Schedul
Sep 05 09:34:35 xuexi3 crond[1611]: (CRON) INFO (RANDOM_DE
Sep 05 09:34:37 xuexi3 crond[1611]: (CRON) INFO (running w
Hint: Some lines were ellipsized, use -l to show in full.
crond定时任务服务应用
cron定时任务名字
crond定时任务进程名
crontab管理定时任务命令
cron是linux系统中以后台进行模式周期性执行命令或指定程序任务的服务软件名。
linux系统启动后,cron软件便会启动,对应的进程名叫crond,默认是定期(每分钟检查一次)检查系统中是否有需要执行的任务计划,如果有,则按计划进行,好比我们平时用的闹钟。
- crond定时任务默认最快的频率是每分钟执行
- 若是需要以秒为单位的计划任务,则编写shell脚本格式,crond不适用
为什么需要crond定时任务
- 夜间数据库备份
- 夜间网站数据(用户上传、文件、图片、程序)备份
- 备份等待时间过长
- 任务重复性高
利用linux的定时任务cron工具可以解决重复性、周期性、自动备份等运维工作
linux下定时任务软件
- at定时任务工具,依赖于atb服务,适用于执行一次就结束的调度任务,例如突发任务,某天夜里3点需要临时性备份数据,可以使用at软件
语法
HH:MM
YYYY-mm-dd
noon 正午中午12点
midnight 午夜12点
teatime 下午茶时间,下午四点
tomorrow 明天
now+1min 一分钟以后
now+1minutes/hours/days/weeks
1分钟之后运行创建文件
[root@xuexi3 ~]# at now+1min #ctrl+d提交任务
at> touch /tmp 111_at.txt
at> <EOT>
job 4 at Mon Sep 5 10:16:00 2022
运行之后,通过邮件检查
[root@xuexi3 tmp]# mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 root Mon Sep 5 10:08 14/554
& 1
Message 1:
From root@xuexi3.localdomain Mon Sep 5 10:08:36 2022
Return-Path: <root@xuexi3.localdomain>
X-Original-To: root
Delivered-To: root@xuexi3.localdomain
Subject: Output from your job 2
To: root@xuexi3.localdomain
Date: Mon, 5 Sep 2022 10:08:36 +0800 (CST)
From: root@xuexi3.localdomain (root)
Status: R
/bin/bash: line 2: $'\E[D\E[D\E[D\E[D\E[D\E[D\E[D\E[D\E[D\E[D\E[D': command not found
定时任务与邮件服务
任务计划出发执行后,会通过邮件发送给用户,(并非互联网上的邮件,而是系统内部的邮件服务)
1.检查服务器端口,25号邮件端口是否打开,centos5是sendmail,centos6、7是postfix服务
[root@xuexi3 ~]# netstat -tunlp |grep 25
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1876/master
tcp6 0 0 ::1:25 :::* LISTEN 1876/master
2.发现未启动25端口的话,则需要启动
首先更改postfix配置文件
vim /etc/postfix/main.cf
修改如下参数
ient_interfaces = all
ient_protocols = all
3.启动postfix服务
systemctl start postfix
systemctl status postfix #查看服务状态
网易邮箱邮件解释
smtp:simple mail transmission protocol
pop3: Post Office Procotol
imap4:Internet Mail Access Procotol
mailx命令
了解三个概念:
MAT:Mail Transport Agent ,邮件传送代理,也就是postfix==服务
MUA:Mail user Agent,收发邮件的客户端,可以是foxmail,也可以是其他客户端
Centos7通过命令mailx发送邮件,通过mail命令是收邮件
[roo@xuexi3 root]$ mailx -s "hello dejun" root #给root系统用户发送邮件 -s添加主题
sssss^H^H^H^H #文章内容
1233333
3332123
. #输入点,退出邮件
EOT #结束符号,end out
mail命令
su - root #切换为root用户
mail #输入mail命令检查邮件
按q退出邮箱
非交互式发邮件
用root给roo回一封邮件,从文本中读取
[root@xuexi3 ~]# vim youjian.txt
[root@xuexi3 ~]# mail -s "hello roo" root < youjian.txt
查看邮件
[roo@xuexi3 ~]$ mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/roo": 1 message 1 new
>N 1 root Mon Sep 5 11:18 21/591 "hello roo"
& 1
Message 1:
From root@xuexi3.localdomain Mon Sep 5 11:18:18 2022
Return-Path: <root@xuexi3.localdomain>
X-Original-To: roo
Delivered-To: roo@xuexi3.localdomain
Date: Mon, 05 Sep 2022 11:18:18 +0800
To: roo@xuexi3.localdomain
Subject: hello roo
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: root@xuexi3.localdomain (root)
Status: R
sss1
sss2
sss3
sss4
定时任务cron实践
向crond进程提交任务的方式与at不同,crond需要读取配置文件,且有固定的文件格式,通过crontab管理文件
cron任务分两类
- 系统定时任务
crond服务处了会在工作时查看/var/spool/cron文件夹下的定时任务文件外,还会查看/etc/cron.d目录以及/etc/anacrontab下面的文件内容,里面存放每天、每周、每月需要执行的系统任务
[root@xuexi3 ~]# ls -l /etc |grep cron
-rw-------. 1 root root 541 Aug 9 2019 anacrontab
drwxr-xr-x. 2 root root 54 Aug 17 11:55 cron.d #系统定时任务
drwxr-xr-x. 2 root root 57 Aug 17 11:55 cron.daily #每天的任务
-rw-------. 1 root root 0 Aug 9 2019 cron.deny
drwxr-xr-x. 2 root root 22 Aug 16 14:33 cron.hourly #每小时的任务
drwxr-xr-x. 2 root root 6 Jun 10 2014 cron.monthly #每月的任务
-rw-r--r--. 1 root root 451 Jun 10 2014 crontab
drwxr-xr-x. 2 root root 6 Jun 10 2014 cron.weekly #每周的定时任务
系统定时任务配置文件 /etc/crontab
[root@xuexi3 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
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
#每一行,就是一条周期任务
crontab
crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似
参数 | 解释 | 使用示例 |
---|---|---|
-l | list查看定时任务 | crontab -l |
-e | edit编辑定时任务 | crontab -e |
-i | 删除定时任务,提示用户确认删除,避免出错 | crontab -i |
-r | 删除定时任务,移除/var/spool/cron/username文件,全没了 | crontab -r |
-u user | 指定用户执行任务,root可以管理普通用户计划任务 | crontab -u |
crontab命令就是在修改/var/spool/cron中的定时任务文件
用户查看定时任务
crontab -l #列出用户设置的定时任务,等于cat /var/spool/cron/root
crontab -e #编辑用户的定时任务,等于如上命令编辑的是 vi /var/spool/cron/root文件
检查crond服务是否运行
[root@xuexi3 ~]# systemctl is-active crond
active
[root@xuexi3 ~]# ps -ef |grep crond
root 1611 1 0 11:57 ? 00:00:00 /usr/sbin/crond -n
定时任务相关的文件
/var/spool/cron 定时任务的配置文件所在的目录
/var/log/cron 定时任务的日志文件
/etc/cron.deny 定时任务黑名单
定时任务的语法格式
查看定时任务配置文件
cat /etc/crontab
案例
每天上午8点30,去上学
30 8 * * * go to school
每天晚上12点回家回家睡觉
00 00 * * * go home
定时任务符号
crontab任务配置基本格式
* * * * * command
分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天) 命令
第一列表示分钟1~59 每分钟用*或者*/1表示
第二列表示小时1-23 (0表示0点)
第三列表示日期1-31
第四列表示月份1-12
第五列标识号星期0-6(0表示星期天)
第六列要运行的命令
(注意:day of month和day of week一般不同时使用)
(注意:day of month和day of week一般不同时使用)
(注意:day of month和day of week一般不同时使用)
时间表示法
- 特定值,时间点有效取值范围内的值
- 通配符,某时间点有效范围内的所有值,表示“每”的意思
特殊符号 | |
---|---|
* | 表示“每”的意思,如00 23 cmd表示每月每周每日的23:00整点执行 |
- | 减号表示时间范围分隔符,如17-19,代表每天的17,18,19点 |
, | 逗号,表示分割时段,如30 17,18,19 * cmd表示每天的17、18、19的半点执行 |
/n | n表示可以整除的数字,每隔n的单位时间,如每隔10分钟表示/10 * cmd |
每小时执行
* * * * *
分 时 日 月 周
00 * * * * 执行命令的绝对路径
每周执行,每周四的凌晨2点1分执行
1 2 * * 4 执行命令的绝对路径
每月执行,每月的3号的下午2点1分执行
1 14 3 * *
每年执行,每年的4月分3号的凌晨2点1分执行
1 2 3 4 *
每周3和周5的2点1分执行
1 2 * * 3,5
每周六,周日的下午1点和2点的每一分钟都执行
* 13,14 * * 6,0
周一到周五的每天早上9点一只到下午6点的每一个整点(工作日的每隔小时整点)
0 9-18 * * 1-5
每隔10分钟执行一次任务
*/10 * * * *
如果没法整除,定时任务则没意义,可以自定制脚本控制频率
定时任务最小单位是分钟,想完成秒级任务,只能通过其他方式(编程语言)
练习题
#每天凌晨3点半,和12点半执行脚本
* * * * *
分 时 日 月 周
30 3,12 * * *
#每隔6小时,相当于6、12、18、24点的半点时刻,执行脚本
* * * * *
分 时 日 月 周
30 */6 * * *
#每天晚上9点30重启nginx
* * * * *
分 时 日 月 周
30 21 * * * /usr/bin/systemctl restart nginx
#每月的1、10号凌晨4点45执行脚本
* * * * *
分 时 日 月 周
45 4 1,10 * *
#每周六,每周的凌晨1点10分执行命令
* * * * *
分 时 日 月 周
10 1 * * 0,6
#每天的18点到23点之间,没隔30分钟执行一次
* * * * *
分 时 日 月 周
*/30 18-23 * * *
#每隔一小时执行一次
* * * * *
分 时 日 月 周
0 * * * *
#4月份的周一到周三的上午11点执行脚本
* * * * *
分 时 日 月 周
0 11 * 4 1-3
#每天早上7点到上午11点,每两小时运行命令
* * * * *
分 时 日 月 周
0 7-11/2 * * *