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命令检查邮件
 

image-20220905110203870

按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

image-20220905152120380

案例

每天上午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 * * * *

如果没法整除,定时任务则没意义,可以自定制脚本控制频率
定时任务最小单位是分钟,想完成秒级任务,只能通过其他方式(编程语言)

Linux系统编写定时任务流程规范及注意事项

image-20220905160920678

image-20220905161214915

练习题

#每天凌晨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 * * * 
posted @ 2022-09-05 18:17  一直前进  阅读(741)  评论(0编辑  收藏  举报