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

场景:

  • 生活中,我们有太多场景需要使用到闹钟,比如早上 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] file
 crontab [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)

*   ,   -  /

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值