当前位置: 首页 > news >正文

第一章 例行性工作(任务计划)

场景:

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

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

  • 但我们不可能一直守在电脑前,毕竟我们也需要下班/睡觉,还要陪女朋友(new一个也行)。而且即使在上班期间,如果到点了还需要人工操作,未免效率太低了。

  • at 命令就是为这个需求而诞生的。使用 at 命令,你可以在特定时间自动完成你所设定的任务,也可以实现自动化,非常方便快捷!

1、单一执行的例行性工作

单一执行的例行性工作:仅处理执行一次就结束了

1.1 at配置文件
  • /etc/at.allow,写在该文件的人可以使用at命令

  • /etc/at.deny,黑名单

  • 两个文件如果都不存在,只有root能使用

#at工作调度对应的系统服务
[root@localhost ~]# ps -ef | grep at
[root@localhost ~]# systemctl status atd
#at的工作文件存放目录
[root@localhost ~]# ll  /var/spool/at
#at工作的日志文件
[root@localhost ~]# ll /var/log/cron
at命令执行过程分析
  • 第一步:寻找/etc/at.allow (白名单)是否存在,写在该文件中用户才可执行at命令

  • 第二步:若/etc/at.allow不存在,则寻找/etc/at.deny(黑名单)文件,写在该文件中的用户不能使用at命令

  • 第三步:若两个文件都不存在则只有root用户可以使用at命令

  • 注意:若拒绝某用户使用at命令则可以将用户名写入到/etc/at.deny中

1.2 at命令详解

image-20241013204642637

命令格式:at [参数] [时间]

参数:
-V 显示版本
-m 当任务完成之后,即使没有标准输出,将给用户发送邮件
-l atq的别名,可列出目前系统上面的所有该用户的at调度
-d atrm的别名,可以取消一个在at调度中的工作
-v 使用较明显的时间格式,列出at调度中的任务列表
-c 可以列出后面接的该项工作的实际命令内容(脚本)
-f 从文件中读取作作业
时间格式:
HH:MM  在今天的HH小时MM分钟执行,如果今天的这个时间点已经过了,则明 
天执行
HH:MM YYYY-MM-DD  强制规定在某年某月的某一天的特殊时刻进行该工作  MMDDYY
now + 2 minutes 从现在开始几分钟minutes, hours, days, or weeks

image-20241013205608608

#定义三分钟之后显示hello
[root@server ~]# at now + 3 minutes

2、循环执行的例行性工作crond

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

[root@server ~]# yum  install  crontabs    # 安装,注意包名
[root@server ~]# systemctl status  crond   # 查看状态
  • crond 进程==每分钟==会定期检查是否有要执行的任务,如果有,则会自动执行该任务,crontab 命令需要 crond 服务支持

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

    • 系统执行的工作系统周期性所要执行的工作,如备份系统数据、清理缓存

    • 个人执行的工作:某个用户定期要做的工作,例如每隔 10 分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置

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

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

  • 两个文件如果都不存在,只有root能使用

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

  • 当用户使用 crontab 新建工作之后,该项工作就会被记录到 /var/spool/cron/目录里面

#crontab工作调度对应的系统服务
[root@localhost ~]# systemctl status crond
#crontab工作的日志文件
[root@localhost ~]# ll /var/log/cron
#用户定义计划任务的文件所在目录
[root@localhost ~]# ll /var/spool/cron/
​
2.2 crontab命令详解
crontab  [-u  user]  [-l| -r | -e]  

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

循环执行的例行性工作:每隔一定的周期就需要执行一次

[root@localhost ~]# crontab  --help
crontab: invalid option -- '-'
crontab: usage error: unrecognized option
Usage:crontab [options] filecrontab [options]crontab -n [hostname]
​
Options:-u <user>  define user-e         edit user's crontab-l         list user's crontab-r         delete user's crontab  (清空)-i         prompt before deleting-n <host>  set host in cluster to run users' crontabs-c         get host in cluster to run users' crontabs-s         selinux context-V         print version and exit-x <mask>  enable debugging

crontab计划任务的时间格式:

0-590-231-311-120-7 0/7

date 月日时分年.秒

crontab计划任务的时间格式中的特殊符号:

特殊字符含义
*代表任何时刻
,代表分隔时段
- 0-59代表一段时间范围
/数字指定时间的间隔频率,例如每 3 分钟进行一次,*/3

注:%在crontab里面有特殊含义,如果有命令里面需要使用%,需要使用\转义。

#每天早上9点整说good morning
[root@server ~]# crontab -e
0 9 * * * wall "good morning"

注:wall命令用于向系统当前所有打开的终端上输出信息。 通过wall命令可将信息发送给每位同意接收公众信息的终端机用户,若不给予其信息内容,则wall命令会从标准输入设备读取数据,然后再把所得到的数据传送给所有终端机用户。

定时邮件发送任务:

  • 设置邮件发送告警功能,每1分钟发送一封邮件

  • 安装邮件服务

[root@server ~]# yum  install  mailx  -y
  • 配置邮件服务

[root@server ~]# vim  /etc/mail.rc
# 最后一行添加以下内容:
set  from=lxx1065372838@163.com
set  smtp=smtp.163.com
set  smtp-auth-user=lxx1065372838@163.com
set  smtp-auth-password=HUamwakqNSvYwQDe
set  smtp-auth=login
# 注意:该文件输入完毕有的系统需要强制保存退出,输入wq!
  • 测试邮件服务

[root@server ~]# echo 123 | mail -s "123" lxx1065372838@163.com
  • 设置定时任务

[root@server ~]# crontab  -e
MAILTO=lxx1065372838@163.com
* * * * * echo "警告" | mail -v -s "test " lxx1065372838@163.com 
书写定时任务的注意事项
  • 6 个字段都不能为空,如果不确定则使用*表示任意时间

  • crontab命令任务的最小时间单位为分钟,最大有效时间为月,如:2024年某时执行、3点30分30秒这样的时间日期无法被识别

  • 定义时间时,日期和星期最好不要一起出现,由于都是以天为单位,非常让管理员混淆

  • 在定时任务中不能,不管是写命令还是在脚本中写命令,最好都用==绝对路径==,相对路径有时会报错

2.3 系统的计划任务(对系统所有用户都生效的任务文件)
[root@localhost ~]# 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

当需要同一时间执行多个脚本时,可以将这多个脚本放在一个目录下,然后使用run-parts来执行。

run-parts:该命令可将后面接的“目录”内的所有文件找出来执行。

可唤醒停机期间的工作任务

anacron 可以处理关机状态时未执行的计划任务,anacron不能指定何时执行某项任务,而是以天为单位或是在开机后立刻进入anacron的操作(/etc/anacrontab)。它会去检测停机期间应该进行但是并没有进行的crontab任务,并将该任务执行一遍,然后anacron就会自动停止了

课堂练习:

实验一:定义三分钟之后显示hello

at now + 3 minutes
at>wall hello

实验二 : 每天早上9点整,说good morning

crontab -e 
00 09 * * * wall "good morning"

注释

  • wall命令用于向系统当前所有打开的终端上输出信息。

  • 通过wall命令可将信息发送给每位同意接收公众信息的终端机用户,若不给予其信息内容,则wall命令会从标准输入设备读取数据,然后再把所得到的数据传送给所有终端机用户。

实验三:指定某些用户不可以执行计划任务

/etc/at.deny

/etc/cron.deny

实验四:系统级别例行性任务

[root@localhost ~]# vim /etc/crontab 

练习

题目:

1. 每分钟执行命令
​
2. 每小时执行
​
3. 每天凌晨3点半和12点半执行脚本
30  3,12 * * *  /usr/bin/bash  a.sh
​
​
4. 每隔6小时,相当于6,12,18,24点半执行脚本
​
5. 30代表半点,8-18/2表示早上8点到下午18点之间每隔2小时执行脚本
​
6. 每天晚上9点30重启nginx
​
7. 每月1和10号凌晨4点45执行脚本
​
8. 每周六和周日凌晨1点10分执行命令
​
9. 每天18点到23点之间,且每隔30分钟执行一次
​
10. 每隔一小时执行一次
​
11. 在4月份的周一到周三的上午11点执行脚本
​
12. 每天早上7点到上午11点且每2小时执行一次
​
13. 每天6点执行脚本
​
14. 每周六凌晨4点执行
​
15. 每周六凌晨4点05执行
​
16. 每天8:40执行
​
17. 在每天10:31且每隔2小时执行一次
​
18. 每周一到周五2:00执行
​
19. 每周一到周五8:00和9:00执行
​
20. 每天10:00,16:00执行
​

答案:

1.  */1 * * * * cmd
2.  0 * * * * cmd
3.  30 3,12 * * * cmd
4.  30 */6 * * * cmd
5.  30 8-18/2 * * * cmd
6.  30 21 * * * /usr/bin/systemctl restart nginx
7.  45 4 1,10 * * cmd
8.  10 1 * * 6,0 cmd
9.  0,30 18-23 * * * cmd  或  */30 18-23 * * * cmd
10.  0 */1 * * * cmd  或  0 * * * * cmd
11.  0 11 * 4 1-3 cmd
12.  0 7-11/2 * * * cmd
13.  0 6 * * * cmd
14.  0 4 * * 6 cmd
15.  5 4 * * 6 cmd
16.  40 8 * * * cmd
17.  31 10/2 * * * cmd
18.  0 2 * * 1-5 cmd
19.  0 8,9 * * 1-5 cmd
20.  0 10,16 * * * cmd

at 单一一次的任务工具

默认系统已经配好
dnf  install at  -y
systemctl start atd       启动at程序---进程  atd 
时间格式:
HH:MM  在今天的HH小时MM分钟执行,如果今天的这个时间点已经过了,则明 
天执行
HH:MM YYYY-MM-DD  强制规定在某年某月的某一天的特殊时刻进行该工作  MMDDYY
now + 2 minutes 从现在开始几分钟minutes, hours, days, or weeks#at 10:12 
at>wall  nihao
at>ctrl+d   #终止任务
#atq   #查看任务列表   == at  -l
任务编号   任务执行时间   任务用户名称
#atrm  job  #删除任务 == at  -d   
#at -c job
任务文件保存位置:  /var/spool/at

at配置文件(限制用户还否可以使用at指令)

/etc/at.allow /etc/at.deny

cron周期性任务

[root@localhost ~]# rpm -qa | grep crontabs
crontabs-1.11-27.20190603git.el9_0.noarch[root@localhost ~]# ps -aux | grep crond
root        1209  0.0  0.2 223912  3772 ?        Ss   18:10   0:00 /usr/sbin/crond -n------------------------------------------------------------------------------------------------------------
创建周期性任务
crontab  
-e  任务编辑
-l  查看任务信息
-u  指定任务用户
-r  清空所有任务#crontab  -e -u redhat
#分 时 日 月 周  命令的绝对路径  参数
* * * * * /usr/bin/touch  /file:wq
#crontab -l -u redhat   #查看任务信息#crontab  -r  -u redhat  清空所有任务判断任务是否成功查看日志文件
cat  /var/log/cron 
....[root@localhost ~]# tail -f /var/log/cron 
Oct 12 21:15:42 localhost crontab[34003]: (root) LIST (root)
Oct 12 21:15:56 localhost crontab[34004]: (root) LIST (redhat)
Oct 12 21:16:02 localhost CROND[34035]: (redhat) CMD (/usr/bin/wall "hahahahaha")
Oct 12 21:16:02 localhost CROND[34005]: (redhat) CMDEND (/usr/bin/wall "hahahahaha")
Oct 12 21:16:15 localhost crontab[34067]: (root) BEGIN EDIT (redhat)
Oct 12 21:17:01 localhost CROND[34099]: (redhat) CMD (/usr/bin/wall "hahahahaha")
Oct 12 21:17:01 localhost CROND[34069]: (redhat) CMDEND (/usr/bin/wall "hahahahaha")
Oct 12 21:17:15 localhost crontab[34067]: (root) REPLACE (redhat)
Oct 12 21:17:15 localhost crontab[34067]: (root) END EDIT (redhat)
Oct 12 21:17:30 localhost crontab[34125]: (root) DELETE (redhat)*   ,   -  /

相关文章:

  • 线性动态规划3
  • 软考 系统架构设计师系列知识点之杂项集萃(56)
  • Unity中AssetBundle使用整理(一)
  • Java NIO 文件处理接口
  • GO语言-导入自定义包
  • Linux基础io知识
  • [超详细,推荐!!!]前端性能优化策略详解
  • 如何实现并运用责任链模式
  • 当虚拟照进现实——《GTA6》如何重新定义开放世界的可能性‌
  • Python3安装HTMLTestRunner
  • 【Tools】Visual Studio使用经验介绍(包括基本功能、远程调试、引入第三方库等等)
  • 使用lldb看看Rust的HashMap
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十七)
  • 害怕和别人发生冲突怎么办? --deepseek
  • lampiao靶场渗透
  • springboot3学习
  • Problem E: 实现冒泡排序(内存优化)
  • Linux常见指令解析(三)
  • 《打造自己的DeepSeek》第2期:怎么安装自己的DeepSeek?
  • 【Tools】VScode远程调试linux服务器(打断点可视化界面方式)
  • 陕西河南山西等地将现“干热风”灾害,小麦产区如何防范?
  • 加拿大新政府宣誓就职
  • 中国巴西关于乌克兰危机的联合声明
  • 技术派|更强的带刀侍卫:从054B型战舰谈谈世界护卫舰发展
  • 新华时评:中国维护国际经贸秩序的立场坚定不移
  • 报告:4月份新增发行的1763亿元专项债中,投向房地产相关领域约717亿元