15、linux系统管理-定时任务

1. at

1.1.at含义

at表示一次性执行的定时任务
at命令如果想要正确执行,需要atd服务支持,启动命令是:service atd start

1.2.at相关的文件

at 的访问控制是依靠/etc/at.allow文件(白名单)和/etc/at.deny文件(黑名单)这两个文件来实现的,具体规则如下:

  • 如果系统中有/etc/at.allow 文件,那么只有写入/etc/at.allow 文件(白名单)中的用户 可以使用 at 命令,其他用户不能使用 at 命令(/etc/at.deny 文件会被忽略,也就是说同一 个用户既写入/etc/at.allow 文件也写入/etc/at.deny 文件,那么这个用户是可以使用 at 命令的,因为/etc/at.allow 文件优先级更高。)。
  • 如果系统中没有/etc/at.allow 文件,只有/etc/at.deny 文件,那么写入/etc/at.deny 文件 (黑名单)中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root 用户不生效
  • 如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 命令。

总结: 系统中默认时只有/etc/at.deny 文件,而且这个文件是空的,这样的话系统中所有的用户都可以
使用 at 命令。不过如果我们打算控制用户的 at 命令权限,把用户写入/etc/at.deny 文件即可

etc/at.allow 文件的权限更高,如果/etc/at.allow 文件存在,则/etc/at.deny 文件失效。/etc/at.allow 管理行为更加严格,因为只有写入这个文件的用户才能使用 at 命令,如果需要禁用 at 命令的用户较多,则可以把少数用户写入这个文件。/etc/at.deny 文件的管理较为松散,如果允 许使用 at 命令的用户较多,则可以把禁用的用户写入这个文件。不过这两个文件都不能对 root 用户 生效。

1.3.at命令

at [选项][时间]
选项: 
 -m:当 at 工作完成后,无论是否命令有输出,都用 email 通知执行 at 命令的用户
 -c:工作号: 显示该 at 工作的实际内容
时间: 
at 支持的时间格式如下: 
	HH:MM:在指定的“小时:分钟”执行命令,例如:02:30
	HH:MM YYYY-MM-DD 在指定的“小时:分钟 年-月-日”执行,例如 02:30 2018-07-25 
	HH:MM[am|pm] [month] [date] 在指定的“小时:分钟[上午|下午][][]”执行, 例如 02:30 July 25
	HH:MM[am|pm] + [minutes|hours|days|weeks] 在指定的时间“再加多久执行”,
	例 如 now + 5 minutes,05am +2 hours
atq 
查询有多少个at任务正在执行
atq -c [工作号] 查看某一个工作的详细信息
atrm  [工作号] 删除对应的工作

1.4.at实战

[root@localhost ~]# at now + 5 minutes
at> sh ./hello.sh >> ./a.txt<EOT>
job 2 at 2020-07-18 10:52   # 按住Ctrl +d 进行退出

[root@localhost ~]# atq
2	2020-07-18 10:52 a root

2.crontab

2.1.crontab含义

循环定时执行任务

2.2.crontab相关文件

crontab 命令是需要 crond 服务支持的,crond 服务同样是独立的服务,所以启动和自启动方法如下

service crond restart
chkconfig crond on

crontab 命令和 at 命令类似,也是通过/etc/cron.allow 和/etc/cron.deny 文件来限制某些用户是否可以使用 crontab 命令的。而且原则也非常相似:

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

这个规则基本和 at 的规则一直,同样/etc/cron.allow 文件的优先级比/etc/cron.deny 文件的 优先级高,Linux 中默认只有/etc/cron.deny 文件。

2.3.crontab 时间设置

项目 含义 范围
第一个* 一小时的第几分钟 0-59
第二个* 一天当中的第几小时 0-23
第三个* 一个月中的第几天 1-31
第四个* 一年当中的地几个月 1-12
第五个* 一周当中的星期几 0-7(0 和 7 都代表星期日)
特殊符号 含义
* 代表任何时间,第一个*表示一个小时每分钟都执行一次的意思
, 代表不连续的时间。比如“0 8,12,16 * * * 命令”,就代表在 每天的 8 点 0 分,12 点 0 分,16 点 0 分都执行一次命令
- 代表连续的时间范围。比如“0 5 * * 1-6 命令”,代表在周一 到周六的凌晨 5 点 0 分执行命令
*/n 代表每隔多久执行一次。比如“*/10 * * * * 命令”,代表每隔 10 分钟就执行一遍命令
时间 含义
45 22 * * * 命令 在 22 点 45 分执行命令
0 17 * * 1 命令 每周 1 的 17 点 0 分执行命令
0 5 1,15 * * 命令 每月 1 号和 15 号的凌晨 5 点 0 分执行命令
40 4 * * 1-5 命令 每周一到周五的凌晨 4 点 40 分执行命令
*/10 4 * * * 命令 每天的凌晨 4 点,每隔 10 分钟执行一次命令

2.4.crontab 的注意事项

  • 六个选项都不能为空,必须填写。如果不确定使用“*”代表任意时间;
  • crontab 定时任务,最小有效时间是分钟,最大时间范围是月。像 2018 年某时执行,3 点 30 分 30 秒这样的时间都不能识别;
  • 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都是以天作为单位, 非常容易让管理员混乱;
  • 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都是用绝对路径。有时相对路径的命令会报错

2.5.使用命令行编写定时任务-不常用

root@localhost ~]# crontab [选项] 
选项: 
	-e:编辑 crontab 定时任务 
	-l:查询 crontab 任务
	-r:删除当前用户所有的 crontab 任务,如果有多个任务,只想删除一个,可 以所以用“crontab -e”
	-u 用户名: 修改或删除其他用户的 crontab 任务。只有 root 可用
crontab -e 这条命令就会进入编辑界面
# 让系统每隔 5 分钟,就向/tmp/test 文件中写入一行“11”,验证一下系统定时任务是否会执行
*/5 * * * * /bin/echo ”11” >> /tmp/test

# 在系统在每周二的凌晨 5 点 05 分重启一次
5 5 * * 2 /sbin/shutdown -r now
crontab -l # 查看root用户的crontab任务
# 删除
crontab -e 进入编辑界面,然后手工进行删除

2.6.使用命令行编写定时任务-常见

第一种:执行某一个指定文件的脚本

 * * * * root sh /root/cron/hello.sh

第二种:执行某一个文件夹里面的所有脚本 需要加上run-parts 关键字

* * * * * root run-parts /root/cron/

3.anacron

3.1.anacron是干什么的

anacron 是用来干什么的呢?我们的 Linux 服务器如果不是 24 小时开机的,那么刚好在关机的时间段之内有系统定时任务(cron)需要执行,那么这些定时任务是不会执行的。也就是说,假设我们 需要在凌晨 5 点 05 分执行系统的日志备份,但是我们的 Linux 服务器不是 24 小时开机的,在晚上需 要关机,白天上班之后才会再次开机。这个定时任务的执行时间我们的服务器刚好没有开机,那么这 个任务就不会执行了。anacron 就是用来解决这个问题的。

3.2.anacron原理

anacron 会使用一天,七天,一个月作为检测周期,用来判断是否有定时任务在关机之后没有执行,如果有这样的任务,anacron 会在特定的时间重新执行这些定时任务。那么 anacron 是如何判断 这些定时任务已经超过了执行时间呢?在系统的 /var/spool/anacron/ 目录中存在 cron.{daily,weekly,monthly}文件,这些文件中都保存着 anacron 上次执行时的时间。anacron 会去 读取这些文件中的时间,然后和当前时间做比较,若果两个时间的差值超过了 anacron 的指定时间差 值(一般是 1 天,7 天和一个月),就说明有定时任务漏掉了没有被执行,这时 anacron 会介入而执 行这个漏掉的定时任务,从而保证在关机时没有被执行的定时任务不会被漏掉

3.3.认识anacron配置文件以及执行过程

在这里插入图片描述
我们用 cron.daily 工作来说明下/etc/anacrontab 的执行过程:

  • 首先读取/var/spool/anacron/cron.daily 中的上一次 anacron 执行的时间;
  • 和当前时间比较,如果两个时间的差值超过 1 天,就执行 cron.daily 工作;
  • 执行这个工作只能在 03:00-22:00 之间;
  • 执行工作时强制延迟时间为 5 分钟,再随机延迟 0-45 分钟时间后,执行
  • 使用 nice 命令指定默认优先级,使用 run-parts 脚本执行/etc/cron.daily 目录中的所有可 执行文件。

3.4.工作中修改对应的配置文件

# /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=0
# the jobs will be started during the following hours only
# 执行时间为3:00-5:00
START_HOURS_RANGE=3-5

#period in days   delay in minutes   job-identifier   command
1       0       cron.daily              nice run-parts /etc/cron.daily
7       0       cron.weekly             nice run-parts /etc/cron.weekly
@monthly 0      cron.monthly            nice run-parts /etc/cron.monthly
# 强制延迟也改为0分钟,不在强制延迟                                                                         

3.5.anacron总结

只需要知道把脚本文件,放到/etc/cron.{daily,weekly,monthly}目录中,系统会自动按照天,日期,月进行循环定时执行对应的脚本

猜你喜欢

转载自blog.csdn.net/weixin_43443216/article/details/107483431