【linux基础】循环执行的例行性任务--crontab (利用crontab周期性发送qq邮件)

一、crontab介绍

本篇我们来学习linux基础中的crontab命令的使用,linux中crontab命令与at命令的区别如下:
at 命令是在指定的时间只能执行一次任务,crontab 命令可以循环重复的执行定时任务,与Windows 中的计划任务有些类似

crond 是 Linux 下用来周期地执行某种任务或等待处理某些事件的一个守护进程,在安装完成操作系统后,默认会安装 crond 服务工具,且 crond 服务默认就是自启动的
如果需要安装则执行以下命令

yum install crontabs	#安装crond服务
systemctl status crond    #查看crond服务状态

crontab命令的使用场景

系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
个人执行的工作:某个用户定期要做的工作,例如每隔 10 分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置

crontab工作过程

1、当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny 文件会被忽略,因为 /etc/cron.allow 文件的优先级更高
2、当系统中只有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令
3、crontab 执行的每一项工作都会被 记录到 /var/log/cron 这个日志文件中
4、当用户使用 crontab 新建工作之后,该项工作就会被记录到 /var/spool/cron/目录里面

二、crontab命令详解

crontab命令运行的格式如下:

crontab  [-u  user]  [-l | -r | -e]
参数说明
-u只有root才能执行该任务
-e编辑crontab工作内容
-l查询crontab任务内容
-r删除cronatb任务

编辑crontab

  • 格式
crontab -e
  • 注意:写入的命令一行为一个命令,每行共6段:前5段为时间,后1段为命令
  • 时间共5段,意义如下:
意义
范围0-590-231-311-120-7 (0和7都表示周日)

特殊字符
*:表示任意时刻
-: 表示范围
, (逗号) :分割时段
数字 :指定时间间隔频率,如:每3分钟执行一次:/3

举例:

1 2 * * *   : 每天凌晨2点1分执行动作
0 17 * * 1  : 每周一下午17点整执行动作
0 5 1,15 * * :每月1日和15日凌晨5点执行动作
40 4 * * 1-5 :每周一至周五凌晨4点40分执行动作
*/10 4 * * * : 每天凌晨4点每隔10分钟执行动作
3,15 8-11 */2 * * :每隔2天上午8-11点的第3分钟和第15分钟执行动作
* * * * * :每隔1分钟执行动作

实验1

  1. 编写test1.sh脚本
#!/bin/bash
        echo  "this is my test sh"$(date)  >>  /root/cro.txt   #输入结果到cro.txt文件中
  1. 设置周期性计划任务
[root@server ~] crontab  -e		#编辑任务内容
* * * * * /bin/bash  /root/test1.sh  #每隔一分钟执行一次
  • 注意:crond服务会自动启动,crontab命令只要保存就会生效
  1. 查看任务
[root@server ~] crontab  -l		#查看任务内容
* * * * * /bin/bash  /root/test1.sh

该命令的运行结果如下图所示:

请添加图片描述

可以看到和设定的一样每隔一分钟进行一次输出到该文件中

  1. 删除任务
[root@server ~] crontab  -r    # 删除任务
[root@server ~] crontab  -l    # 查看任务
no crontab for root

实验2

  • 让系统每周1凌晨6点重启一次
[root@server ~] crontab  -e
0 6 * * 1    /sbin/shutdown -r now   #调用系统配置文件进行运行

实验3 (qq邮箱周期发送)

设置qq邮箱每一分钟发送一次邮件

  1. QQ邮箱设置

进入qq邮箱的设置界面,进入账号设置一栏
请添加图片描述

开启POP3/SMTP 服务

请添加图片描述

服务未开启的情况下点击根据系统提示进行登录开启
开启服务后进入界面中的管理服务,在安全设置一栏中选择生成授权码,根据系统提示进行操作

请添加图片描述

授权码生成完毕后复制保存下来,进行下一步操作

  1. 安装邮件服务
[root@server ~] yum  install  s-nail -y
  1. 配置邮件服务
[root@server ~] vim  /etc/s-nail.rc
set  from=(自己的qq号)@qq.com
set  smtp=smtp.qq.com
set  smtp-auth-user=(qq号)@qq.com
set  smtp-auth-password=(输入刚才保存的授权码)
set  smtp-auth=login
# 注意:文件配置完毕需要强制保存并退出,末行模式下输入wq!
  1. 测试邮件服务
[root@server ~] echo  "testmail"  |  mail  -s  "testmail"  (qq号)@qq.com
  1. 设置周期性的任务,每隔1分钟发送邮件
[root@server ~] crontab  -e
MAILTO=(qq号)@qq.com

* * * * * echo  "Hello,world!!!"  |  mail  -v  -s  "邮件测试"  (qq号)@qq.com

实验结果如下图所示:
请添加图片描述

在实验成功后需要用crontab -r 把该任务进行删除,否则qq邮箱会一直收到测试邮件,可能会妨碍邮箱的正常使用~

注意事项

  • 6 个字段都不能为空,如果不确定则使用*表示任意时间
  • crontab命令任务的最小时间单位为分钟,最大有效时间为月,如:2024年某时执行、3点30分30秒这样的时间日期无法被识别
  • 定义时间时,日期和星期最好不要一起出现,由于都是以天为单位,非常容易让管理员混淆
  • 在定时任务中不管是不是在脚本中写命令,最好都用绝对路径,相对路径有时会报错

三、系统级别的计划任务

  • crontab -e 是每个用户都可以执行的命令,但有时定时任务必须由系统执行,此时就需要编辑 /etc/crontab 配置文件来实现
  • 配置文件仅能通过root定义,不可以使用普通账户身份去执行计划任务
  • 方法:在/etc/crontab 最后一行新增计划任务即可
[root@server ~] vim  /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

分析

  • SHELL=/bin/bash : 指定系统使用那个shell解释器去执行
  • PATH=/sbin:/bin:/usr/sbin:/usr/bin : 系统执行命令的搜索路径
  • MAILTO=root : 表示执行任务的信息通过邮件发送给谁
  • user-name : 表示执行命令的用户是谁

实验

每天6:00将日志文件/var/log/messages 文件进行备份,备份到/backup目录中,备份时需要将文件名修改为logfileYYYY-MM-DD-HH:MM:SS

[root@server ~] mkdir  /backup
[root@server ~] vim  /etc/crontab
0 6 * * * root  /usr/bin/cp  /var/log/messages  /backup/logfile`date  +\%Y-\%m-\%d-\%H:\%M:\%S` 
# 反引号``:表示将引起的内容识别为命令
# 在crontab中%表示换行,需要增加转义符\进行转义

crontab命令的使用到这里就介绍完毕了~
如果内容有误,麻烦大家评论区指出!
如有疑问可以在评论区留言!

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,cron-utils可以用来验证crontab表达式的有效。通过使用cron-utils,您可以解析和验证一个crontab表达式的每个部分,包括分钟、小时、日期、月份和星期几。如果表达式无效,cron-utils将返回一个错误消息,告诉您表达式的哪个部分是无效的。 下面是一个使用cron-utils验证crontab表达式有效的示例代码: ```java import com.cronutils.descriptor.CronDescriptor; import com.cronutils.model.Cron; import com.cronutils.model.definition.CronDefinitionBuilder; import com.cronutils.parser.CronParser; import com.cronutils.validator.CronValidator; public class CronUtilsExample { public static void main(String[] args) { String crontabExpression = "0 0 * * * ?"; // an example crontab expression CronParser parser = new CronParser(CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ)); Cron cron = parser.parse(crontabExpression); CronValidator validator = CronValidator.instance(); validator.validate(cron); CronDescriptor descriptor = CronDescriptor.instance(); String description = descriptor.describe(cron); System.out.println(description); } } ``` 在上面的代码中,我们首先使用CronParser解析了一个crontab表达式,然后使用CronValidator验证了这个表达式的有效。最后,我们使用CronDescriptor生成了一个可读的描述,以便了解这个表达式的含义。如果表达式无效,CronValidator将会抛出异常,告诉您表达式的哪个部分是无效的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值