文章目录
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}目录中,系统会自动按照天,日期,月进行循环定时执行对应的脚本