第一章 Linux的例行性工作

1.1 应用场景

  • 生活中,我们有太多场景需要使用到闹钟,比如早上 7 点起床,下午 4 点开会,晚上 8 点购物,等等。

  • 在 Linux 系统里,我们同样也有类似的需求。比如我们想在凌晨 1 点将文件上传服务器,或者在晚上 10 点确认系统状态等等。

但我们不可能一直守在电脑前,毕竟我们也需要下班/睡觉,而且即使在上班期间,如果到点了还需要人工操作,未免效率太低了。所以计划任务应运而生。

通过设置计划任务可以让服务器在指定时间执行指定命令。

1.2 单一执行的例行性任务–at(一次性)

1.2.1 安装

  • at命令需要安装
[root@server ~]# yum  install  at  -y
[root@server ~]# at  -V   # 大写V
at version 3.2.2
  • 启动服务
[root@server ~]# systemctl start  atd
[root@server ~]# systemctl enable  --now  atd  # 设置开机启动
[root@server ~]# systemctl  status  atd  # 查看状态

1.2.2 at命令详解

at命令执行过程
  • 第一步:寻找/etc/at.allow (白名单)是否存在,写在该文件中用户才可执行at命令
  • 第二步:若/etc/at.allow不存在,则寻找/etc/at.deny(黑名单)文件,写在该文件中的用户不能使用at命令
  • 第三步:若两个文件都不存在则只有root用户可以使用at命令
  • 当用户使用at 新建工作之后,该项工作就会被记录到 /var/spool/at/目录里面。
  • at 执行的每一项工作都会被记录到 /var/log/cron 这个日志文件中。
格式
at  -参数   日期时间
-m:当任务完成后,即使没有标准输出,也会给用户发送邮件
-l:列出系统上所有用户的at任务,等价于atq
-d:删除或取消一个任务
-v:使用时间格式,列出at任务
-c:可以列出任务之后的命令内容
-f:从文件中读取
时间格式
参数 说明
HH:MM 在今天HH小时的MM分钟执行,若时间点错过,将在明天执行
HH:MM YYYY-MM-DD 规定在某年某月的某一天的特殊时刻执行该工作
now +2 minutes 从现在开始的minutes、hours、days、weeks执行

1.2.3 实验

实验1
  • 延迟执行ls /root ,并将结果写入到at.txt中
[root@server ~]# at  now +2 minutes
warning: commands will be executed using /bin/sh
at> ls  /root  >  /root/at.txt
at> <EOT>      # 点击ctrl+d 结束交互性界面

[root@server ~]# at  -l   # 查看已存在的计划任务
3	Thu May 25 14:17:00 2023 a root
[root@server ~]# atq      # 同上
3	Thu May 25 14:17:00 2023 a root
注意
  • at命令只要指定的时间正确,就可以执行对应的命令
  • at命令的输出结果不会显示到屏幕上
  • at命令中执行的命令最好使用绝对路径,不容易报错
  • at命令只会执行一次
实验2
  • 不使用交互性命令实现,通过管道符命令执行
[root@server ~]# echo  "echo  'hello  again'  >>  /root/at.txt" | at  now  +1  minute
实验3
  • 设置某账户at命令不可用
[root@server ~]# useradd  ce1   # 新建账户
[root@server ~]# passwd  ce1    # 设置密码
更改用户 ce1 的密码 。
新的密码:                       # 123
无效的密码: 密码少于 8 个字符
重新输入新的密码:                # 123
passwd:所有的身份验证令牌已经成功更新。
[root@server ~]# tail  -1  /etc/passwd  # 倒叙查看账户管理文件
ce1:x:1001:1001::/home/ce1:/bin/bash
[root@server ~]# vim  /etc/at.deny   # 设置黑名单
ce1                                  # 输入

[root@server ~]# su -  ce1             # 切换账户
[ce1@server ~]$ at  14:36         # 测试,at命令不可用
You do not have permission to use at.

监控at任务文件:

[root@server ~]# watch -n  1 ls  -l  /var/spool/at

查看任务执行日志:

[root@rhel93 ~]# tail  -f   /var/log/cron

1.3 循环执行的例行性任务–crontab(周期性)

1.3.1 安装

  • at 命令是在指定的时间只能执行一次任务,crontab 命令可以循环重复的执行定时任务
  • crond 是 Linux 下用来周期地执行某种任务或等待处理某些事件的一个守护进程,在安装完成操作系统后,默认会安装 crond 服务工具,且 crond 服务默认就是自启动的,若需要安装则执行如下命令:
[root@server ~]# yum  install  crontabs    # 安装,注意包名
[root@server ~]# systemctl status  crond   # 查看状态
  • crond 进程每分钟会定期检查是否有要执行的任务,如果有,则会自动执行该任务,crontab 命令需要 crond 服务支持

  • linux 任务调度的工作主要分为以下两类:

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

1.3.2 crontab工作过程

  • 当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny 文件会被忽略,因为 /etc/cron.allow 文件的优先级更高。

  • 当系统中只有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令。

  • 当用户使用 crontab 新建工作之后,该项工作就会被记录到 /var/spool/cron/目录里面;系统级别的工作需要写在/etc/crontab。

  • crontab 执行的每一项工作都会被记录到 /var/log/cron 这个日志文件中。

1.3.3 crontab命令详解

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

执行crontab 命令就是在修改 /var/spool/cron 中的定时任务文件。

编辑crontab
[root@server ~]# crontab  -e
  • 写入的命令格式:每一行书写一个工作,每个工作共有6个字段
#示例
*/5   6-8   *   8   1  /bin/bash  /test.sh
代表意义 分钟 小时 日期 月份 星期 命令
数字范围 0-59 0-23 1-31 1-12 0-7(0和7表示周日) 执行的动作
时间格式中的特殊字符 含义
* 任意时刻
- 表示时间范围
,(逗号) 分割时段
*/数字 指定时间间隔的频率,如:每3分钟执行一次,*/3
时间 含义
1 2 * * * 每天凌晨2点零1分执行动作
0 17 * * 1 每周一下午17点整执行动作
0 5 1,15 * * 每月的1号和15号凌晨5点执行动作
40 4 * * 1-5 每周1到周5的凌晨4点40分执行动作
*/10 4 * * * 每天凌晨4点每隔10分钟执行动作
3,15 8-11 */2 * * 每隔2天的上午8点到11点的第3分钟和第15分钟执行动作
* * * * * 每1分钟执行一次动作

[!Warning]

6 个字段都不能为空,如果不确定时间则使用*表示任意时间;
crontab命令任务的最小时间单位为分钟,最大有效时间为月;
定义时间时,日期和星期最好不要一起出现,由于都是以天为单位,会让管理员混淆;
在定时任务中,不管是写命令还是在脚本中写命令,最好都用绝对路径,相对路径有可能会因为找不到命令而报错;

1.3.4 实验

实验4
  • 设置循环周期性任务
[root@server ~]# crontab  -e
*/2 * * * * wall $(date)
  • 注意:crond服务是自动启动的,crontab命令只要保存退出后就会生效

  • 查看任务:

[root@master ~]# crontab  -l
*/2 * * * * wall $(date)
  • 删除任务
[root@server ~]# crontab  -r   # 删除
[root@server ~]# crontab  -l   # 查看列表
no crontab for root
实验5
  • 让系统在每周1凌晨6点重启一次
[root@server ~]# crontab  -e
0 6 * * 1  /sbin/shutdown  -r now
实验6
  • 设置邮件发送告警功能,每1分钟发送一封邮件

  • 登录qq邮箱,打开账号与安全:
    在这里插入图片描述

生成授权码后,复制授权码:

在这里插入图片描述

#linux上安装邮件客户端
[root@server ~]# yum install s-nail -y
#在文件的最后添加如下内容
[root@server ~]# vim  /etc/s-nail.rc
set v15-compat
set from="账号名@qq.com"                      #账号名写自己的
set mta=smtps://qq号:授权码@smtp.qq.com:465  #如果是qq账号则端口号465,如果是163邮箱账号端口号25或者587
set smtp-auth=login
#测试
[root@server ~]# echo test-mail | s-nail -s "test" 账号名@qq.com
#登录自己的邮箱账号查看是否收到邮件
  • 设置定时任务
[root@server ~]# crontab  -e

* * * * *   echo  "警告,SERVER服务器内存较低,速处理"  | s-nail   -s  "告警邮件"  zhanghaoming@qq.com  

1.3.5 系统级别的计划任务

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

    [root@master01 ~]# ll /etc/cron.d/0hourly
    -rw-r--r--. 1 root root 128  711  2022 /etc/cron.d/0hourly
    [root@master01 ~]# cat /etc/cron.d/0hourly
    # Run the hourly jobs
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    01 * * * * root run-parts /etc/cron.hourly
    [root@master01 ~]# cat  /etc/anacrontab
    # /etc/anacrontab: configuration file for anacron
    
    # See anacron(8) and anacrontab(5) for details.
    
    SHELL=/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    # the maximal random delay added to the base delay of the jobs
    RANDOM_DELAY=45
    # the jobs will be started during the following hours only
    START_HOURS_RANGE=3-22
    
    #period in days   delay in minutes   job-identifier   command
    1       5       cron.daily              nice run-parts /etc/cron.daily  #每天延迟5分钟执行/etc/cron.daily/目录中的所有脚本
    7       25      cron.weekly             nice run-parts /etc/cron.weekly  #每7天延迟25分钟执行/etc/cron.weekly目录中的所有脚本
    @monthly 45     cron.monthly            nice run-parts /etc/cron.monthly #每月延迟45分钟执行/etc/cron.monthly目录中的所有脚本
    [root@server ~] # ls -l /etc/ | grep cron*
    cron.d			# 系统定时任务
    cron.daily		# 每天的任务
    cron.deny		# 定时任务黑名单
    cron.hourly		# 每小时执行的任务
    cron.monthly	# 每月的定时任务
    crontab			# 定义系统级别的计划任务
    cron.weekly		# 每周的定时任务
    
    
  • crontab -e 是每个用户都可以执行的命令,即每个用户自定义的计划任务,但有时定时任务必须由系统执行,此时就需要编辑/etc/crontab配置文件来实现。

[root@server ~]# vim  /etc/crontab
  • 系统级计划任务仅能通过root定义,在/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
  • 例1:每周二11点将时间写入/t1.txt文件中
[root@server ~]# vim  /etc/crontab
0 11 * * 2  root  date >> /t1.txt
  • 例2:每天6:00点将日志/var/log/messages 文件备份到/backup目录中,备份后的日志文件名修改为logfileYYYY-MM-DD
[root@server ~]# mkdir  /backup     # 新建目录
[root@server ~]# vim  /etc/crontab  # 编辑系统计划任务
0 6 * * *   root   /bin/cp  /var/log/messages /backup/logfile$(date  +\%Y-\%m-\%d)

# 注意:可以使用* * * * * 进行测试
# $() 表示将引起的内容识别为命令,也可以使用``反引号【不是单引号】
# 在crontab系统中%表示换行,需要增加转义符\
  • 拓展:当需要同一时间执行多个脚本时,可以将这多个脚本放在一个目录下,然后使用run-parts来执行。

    #run-parts:该命令可将后面接的“目录”内的所有文件找出来执行。
    #假设我的所有脚本放在/text目录下,现在要使用root用户每天都执行一下这个目录下的脚本,写法为:
    [root@localhost ~]# vim /etc/crontab
    0 8 * * * root run-parts /text
    

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐