一、实验环境(rhel7.0版本)
主机环境:rhel7.0
各主机信息
| 主机名 | IP |
|---|---|
| server | 172.25.254.1 |
二、什么是计划任务
计划任务分为【单一任务】与【循环任务】。通俗的讲,
- 单一任务就是突发性的任务:就是这次做完以后就没有的那一种;
- 循环任务就是例行性的任务:就是每隔一定的周期要来办的事项。
那如何来实现这两个功能呢?那就得使用【at】与【crontab】这两个东西了。
- at:at 是个可以处理仅执行一次就结束的命令。不过要执行 at 时,必须要有 atd 这个服务;
- crontab:crontab 这个命令所设置的任务将会循环地一直执行下去,可循环的时间为分钟、小时、天、月、周。不过要执行 crontab 时,必须要有 crond 这个服务。crontab 除了可以使用命令执行外,亦可编辑 /etc/crontab 来支持。
三、仅执行一次的计划任务
1、atd 的启动与 at 运行的方式
(1)atd 的启动

(2)at 运行的方式
我们使用 at 这个命令来产生所要运行的任务,并将这个任务以文本文件的方式写入 /var/spool/at 目录内,该任务便能等待 atd 这个服务的使用与执行了。
不是所有的人都可以执行 at 计划任务,我们可以利用 /etc/at.allow 和 /etc/at.deny 这两个文件来实现对 at 的使用限制。加上这两个文件后,at 的工作情况其实是这样的:
- 先找寻 /etc/at.allow 这个文件,写在这个文件中的用户,才能使用 at,没有在这个文件中的用户则不能使用 at(即使没有写在 at.deny 当中);
- 如果 /etc/at.allow 不存在,就查找 /etc/at.deny 这个文件,写在这个 at.deny 中的用户则不能使用 at,而没有在这个 at.deny 文件中的用户,就可以使用 at;
- 如果这两个文件都不存在,那么只有 root 可以使用 at 这个命令。
2、实际运行单一计划任务
(1)at 命令——到时间点即执行
at [-mld] TIME
at -c 任务号码
选项与参数:
—m:当 at 的任务完成后,即使没有输出信息,亦发 email 通知使用者该任务已完成
-l:at -l 相当于 atq,列出目前系统上面的所有该使用者的 at 计划
-d:at -d 相当于 atrm,可以取消一个在 at 计划中的任务
TIME:时间格式,这里可以定义出【什么时候要执行 at 这项任务】的时间,格式有:
HH:MM eg: 04:00
在今日的 HH:MM 时刻执行,若该时刻已超过,则明天的 HH:MM 执行此任务。
HH:MM YYYY-MM-DD eg: 04:00 2019-01-01
强制规定在某年某月的某一天的特殊时可执行该任务。
HH:MM[am|pm] [Month] [Date] eg: 04pm July 30
也是一样,强制在某年某月某日的某时刻执行
HH:MM[am|pm] + number [minutes|hours|days|weeks] eg: now + 5 minutes 、04pm +3 days
就是说,在某个时间点【再加几个时间后】才执行
【1】、范例一:在 11:30 执行【创建 /mnt/test 目录】的命令
[root@server ~]# at 11:30
at> /usr/bin/mkdir /mnt/test
at> <EOT> <==这里输入 [Ctrl]+d 就会出现<EOF>的字样,代表结束
job 1 at Tue Jun 18 11:30:00 2019
# 上面这行信息在说明,第 1 个 at 任务将在 2019/06/18 的 11:30 执行
# 而 执行 at 会进入所谓 at shell 环境,让你执行多重命令等待运行。
【2】、范例二:将上述的任务内容列出来看看
[root@server ~]# at -c 1
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
...(中间省略)...
${SHELL:-/bin/sh} << 'marcinDELIMITER450473e9'
mkdir /mnt/test # 这一行最重要
marcinDELIMITER450473e9
【3】、范例三:查询系统中有几项【单一计划任务】
[root@server ~]# at -l 或 atq<==查看单一计划任务
1 Tue Jun 18 11:30:00 2019 a root
[root@server ~]# date
Tue Jun 18 11:30:20 CST 2019
[root@server ~]# ls /mnt/ # 可以看到【单一计划任务1】执行成功
test
【4】、范例四:设置单一计划任务(10 分钟后,执行【创建 /mnt/file 文件】的命令),并立刻取消该任务
[root@server ~]# at now+10minutes
at> /usr/bin/touch /mnt/file
at> <EOT>
job 2 at Tue Jun 18 11:50:00 2019
[root@server ~]# at -l
2 Tue Jun 18 11:50:00 2019 a root
[root@server ~]# at -d 2 或 atrm 2 <==取消单一计划任务
[root@server ~]# at -l
[root@server ~]#
【5】、范例五:设置单一计划任务(2分钟后,执行【删除 /mnt/test 】的命令),并在执行完毕之后,发送邮件给 root。
[root@server ~]# at -m now+2minutes
at> /usr/bin/rm -rf /mnt/test
at> <EOT>
job 3 at Tue Jun 18 11:50:00 2019
[root@server ~]# mail
...(前面省略)...
>N 14 root Tue Jun 18 11:50 13/476 "Output from your job 12"
N 15 logwatch@server.loca Tue Jun 18 11:50 53/1745 "Logwatch for server (Linux)"
& q
[root@server ~]# ls /mnt/ # /mnt/test 已经不存在
[root@server ~]#
【6】、范例六:设置单一计划任务(2分钟后,执行输出 Hello 的命令)
[root@server ~]# ps
PID TTY TIME CMD
1132 pts/0 00:00:00 bash
2991 pts/0 00:00:00 ps
[root@server ~]# at now+2minutes
at> /usr/bin/echo "Hello" > /dev/pts/0
at> <EOT>
job 15 at Tue Jun 18 12:02:00 2019
[root@server ~]# Hello <== 到时间之后,你会看到终端上有 Hello 字样的输出
需要注意的几个点:
- 事实上,当我们使用 at 时会进入一个 at shell 的环境来让用户执行任务命令。此时,建议你最好使用绝对路径来执行你的命令,避免出问题。
- 如果在 at shell 内的命令并没有输出任何信息,那么 at 默认不会发 email 给执行者。如果你想让 at 无论如何都发一封 email 告知你是否执行了命令,可以使用 【at -m 时间格式】来执行命令。
- 有些朋友希望【我要在某某时刻,在我的终端显示出 Hello 的字样】,然后就在 at 里面执行这样的信息【/usr/bin/echo "Hello"】。等时间到了,却没有发现任何信息在屏幕上显示,这是什么原因?这是因为 at 的执行与终端环境无关,而所有标准输出/标准错误输出都会发送到执行者的 mailbox 中,所以在终端上当然看不到任何信息。没关系,可以通过终端的设备来处理。假如你在 tty1 登录,则可以使用【/usr/bin/echo "Hello" > /dev/tty1】来替换。
- 由于 at 计划任务的使用,系统会将该项 at 任务独立出你的 bash 环境,直接交给系统的 atd 程序来接管。因此,当你执行了 at 的任务之后就立刻脱机了,剩下的工作就完全交给 Linux 管理。
(2)batch 命令——系统有空时才执行
其实 batch 是利用 at 来执行命令的,只是 batch 可以拿来作为判断是否要立刻执行后台 at 程序的根据。
batch神奇的地方在于:它是在 CPU 的任务负载小于 0.8 的时候,才执行你的工作任务。
那什么是任务负载呢?举例来说,如果我有一个程序需要一直使用 CPU 的运算功能,那么此时 CPU 的使用率可能达到 100%,但数 CPU 的任务负载则是趋近于【1】,因为 CPU 仅负责一个任务嘛。
下面我们来实验一下 batch,为了产生 CPU 较高的任务负载,我们执行下面的 4 个程序,来模拟高负载:
1、执行下面的 4 个程序,然后在系统嗯闲置时,执行【mkdir /mnt/xjj】 的任务
[root@server ~]# echo "scale=100000; 4*a(1)" | bc -lq &
[root@server ~]# echo "scale=100000; 4*a(1)" | bc -lq &
[root@server ~]# echo "scale=100000; 4*a(1)" | bc -lq &
[root@server ~]# echo "scale=100000; 4*a(1)" | bc -lq &
# 然后等待个大约数十秒的时间,之后再确认一下任务负载的情况。
[root@server ~]# uptime
12:18:55 up 1:50, 2 users, load average: 3.46, 1.33, 0.52
[root@server ~]# batch
at> /usr/bin/mkdir /mnt/xjj
at> <EOT>
job 17 at Tue Jun 18 12:19:00 2019
[root@server ~]# date; atq
Tue Jun 18 12:19:50 CST 2019
17 Tue Jun 18 12:19:00 2019 b root
# 可以看到,明明时间已经超过了,却没有实际执行 at 任务。
[root@server ~]# jobs
[1] Running echo "scale=100000; 4*a(1)" | bc -lq &
[2] Running echo "scale=100000; 4*a(1)" | bc -lq &
[3]- Running echo "scale=100000; 4*a(1)" | bc -lq &
[4]+ Running echo "scale=100000; 4*a(1)" | bc -lq &
[root@server ~]# kill -9 %1 %2 %3 %4
# 这时先用 jobs 找出后台任务,再使用 kill 删除四个后台任务后,慢慢等待任务负载的下降
[root@server ~]# uptime; atq
12:23:22 up 1:55, 2 users, load average: 1.00, 1.99, 1.08
17 Tue Jun 18 12:19:00 2019 b root
[root@server ~]# uptime; atq
12:24:38 up 1:56, 2 users, load average: 0.29, 1.55, 1.00
[root@server ~]# ls /mnt/
xjj
# 在 1:55 时,由于 loading 还是高于 0.8,因此 atq 可以看到 at job 还是持续再等待当中
# 但是到了 1:56 时,由于 loading 降低到了 0.8 以下,所以 atq 就执行完毕
使用 uptime 可以查看到 1分钟、5 分钟、15 分钟的【平均任务负载】量。因为是平均只,所以当我们入上表删除掉 四个任务后,任务负载不会立即降低,需要一段时间让这 1 分钟平均值慢慢恢复到接近 0。当小于 0.8 之后的【整分钟时间】时,atd 就会执行 batch 任务。
什么是【整分钟时间】呢?不论是 at 还是 crontab ,它们最小的时间单位都是【分钟】。所以,它们的任务是【每分钟检查一次】来处理的,就是整分(秒为 0 的时候)。
batch 也是使用 atq 与 atm 来管理的。
3、at 命令的执行权力设定
(1)用户黑名单,在此名单中出现的用户不能执行at命令——/etc/at.deny
【1】、编辑etc/at.deny
在/etc/at.deny中编写xin chen,表示xin和chen这两个用户不可以使用at命令
[root@server ~]# vim /etc/at.deny
xin
chen
【2】、测试


(2)用户白名单,只有在此名单中出现的用户才能执行at命令(root用户除外),白名单默认不存在,需要自己创建——/etc/at.allow
【1】、编辑etc/at.allow
在/etc/at.allow中编写xin chen表示只有xin和chen这两个用户可以使用at命令
[root@server ~]# vim /etc/at.allow
xin
chen
【2】、测试:

![]()
四、循环执行的计划任务
1、crond 的启动与 crontab 运行的方式
(1)crond 的启动

(2)crontab 运行的方式
我们使用 crontab 这个命令来产生所要运行的任务,并将这个任务以文本文件的方式写入 /var/spool/cron 目录内,而且是以账号来作为判断根据的。该任务便能等待 crondd 这个服务的使用与执行了。
举例来说,student 使用 crontab 后,它的任务会被记录到 /var/spool/cron/student 中。但请注意,不要使用 vi 直接编辑该文件,因为可能由于输入语法错误,会导致无法执行 cron。
另外,cron 执行的每一项任务都会被记录到 /var/log/cron 这个日志文件中。
不是所有的人都可以执行 crontab 计划任务,我们可以利用 /etc/cron.allow 和 /etc/cron.deny 这两个文件来实现对 crontab 的使用限制。加上这两个文件后,crontab 的工作情况其实是这样的:
- 先找寻 /etc/cron.allow 这个文件,写在这个文件中的用户,才能使用 crontab,没有在这个文件中的用户则不能使用 crontab(即使没有写在 cron.deny 当中);
- 如果 /etc/cron.allow 不存在,就查找 /etc/cron.deny 这个文件,写在这个 cron.deny 中的用户则不能使用 crontab,而没有在这个 cron.deny 文件中的用户,就可以使用 crontab;
- 如果这两个文件都不存在,那么只有 root 可以使用 crontab 这个命令。
2、循环计划任务的发起方式
(1)发起方式一:crontab 命令
crontab [-u username] [-e | -l | -r]
选项与参数:
-u:指定用户名,只有 root 有权限,即只有 root 才能用 -u 参数
-e:编辑 crontab 的任务内容
-l:查看 crontab 的任务内容
-r:删除所有的 crontab 的任务内容,若仅要删除一项,请用 -e 编辑
【1】、案例一:假设你的女朋友生日是 5 月 2 日,你想要在 5 月 1 日的 23:59 发一封信给她,这封信的内容已经写在 /home/student/lover.txt 内了,该如何执行?
[student@server ~]$ crontab -e
59 23 1 5 * mail kiki < /home/student/lover.txt
【2】、案例二:假如每五分钟需要执行 /home/student/test.sh 一次,又该如何?
[student@server ~]$ crontab -e
*/5 * * * * /home/student/test.sh
【3】、案例三:假如你每星期六都与朋友有约,那么想要每个星期五下午 4:30 告诉你的朋友不要忘记星期六的约时,又该如何?
[student@server ~]$ crontab -e
30 4 * * 5 mail friend@his.server.name < /home/student/friend.txt
【4】、案例四:查看用户目前的 crontab 内容
[student@server ~]$ crontab -l
59 23 1 5 * mail kiki < /home/student/lover.txt
*/5 * * * * /home/student/test.sh
30 4 * * 5 mail friend@his.server.name < /home/student/friend.txt
【5】、案例五:删除用户目前所有的 crontab 内容
[student@server ~]$ crontab -r
[student@server ~]$ crontab -l
no crontab for student
请注意:【如果只是想要删除某个 crontab 的任务选项,那么请使用 crontab -e 来重新编辑即可】。如果使用 -r 的参数,是会将所有的 crontab 数据内容都删掉的。
下面介绍,crontab 命令中写入的 6 个字段的含义:
如果有七位:最开始的一位就是秒
如果有八位:最开始的一位时秒,最后一位是年
| 代表意义 | 分钟 | 小时 | 天 | 月份 | 周 | 命令 |
| 数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 | 需要执行的命令 |
比较有趣的是那个【周】,周的数字为 0 或 7 时,都代表【星期天】的意思。另外,还有下面这些特殊字符:
| 特殊字符 | 代表意义 |
| *(星号) | 代表任意时刻都接受的意思。举例来说, 0 12 * * * command 代表【不论何月、何日的星期几的 12:00 都执行后续命令】的意思 |
| ,(逗号) |
代表分隔时段的意思。举例来说,如果要执行的任务是 3:00 与 6:00,就会是 0 3,6 * * * command |
| -(减号) |
代表一段时间范围内。举例来说,8 点到 12 点之间的每小时的 20 分都执行一想任务: 20 8-12 * * * command |
| /n(斜线) |
那个 n 代表数字,亦即是【每隔 年 单位间隔】的意思,例如每五分钟执行一次,则: */5 * * * * command 用 * 与 /5 来搭配,也可以写成 0-59/5,相同的意思。 |
* 10,14,16 * * * 每天10点,14点,16点
* */30 9-17 * * * 每天早上9点到下午5点,每隔30分钟
* 0-5 14 * * * 每天下午2点到2:05
(2)发起方式二:编辑配置文件——/etc/crontab、/etc/cron.d/*、/etc/cron.hourly/*、/etc/cron.daily/*、/etc/cron.weekly/*、/etc/cron.monthly/*
- 个人化的操作使用用【crontab -e】
- 系统维护管理员使用【vim /etc/crontab】
- 自己开发软件使用【vim /etc/cron.d/newfile】——newfile 这个名字随意给
- 固定每小时、每日、每周执行的特别任务:如果是与系统维护有关,还是建议放置到 /etc/crontab 中集中管理较好。如果想要偷懒或是一定要在某个周期内执行的任务,也可以放置到 【/etc/cron.hourly/】、【/etc/cron.daily/】、【/etc/cron.weekly/】、【/etc/cron.monthly/】目录下
【1】、配置文件 /etc/crontab
[root@server ~]# cat /etc/crontab
SHELL=/bin/bash <==使用哪种 shell。
PATH=/sbin:/bin:/usr/sbin:/usr/bin <== 执行文件查找路径
MAILTO=root <==若有额外的 stadout,用 email 将数据给谁
# 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
从上面的内容,我们可以看到,这个文件与 crontab -e 的内容几乎一模一样,只有几个地方不太相同:
- SHELL:就是默认使用的 shell
- PATH:就是输入执行文件的查找路径
- MAILTO:就是当 /etc/crontab 这个文件中的循环计划任务的命令发生错误时,或是该任务的执行结果有标准输出/标准错误时,会将错误信息或是屏幕显示的信息传给谁?默认当然是由系统直接发一封 email 给 root。
- 【分钟 小时 天 月 周 身份 命令】7个字段的设置
【2】、配置文件 /etc/cron.d/*
[root@server ~]# ll /etc/cron.d
total 20
-rw-r--r--. 1 root root 128 Jan 28 2014 0hourly
-rw-r--r--. 1 root root 26 Jun 13 17:12 checktime
-rw-r--r--. 1 root root 108 Mar 10 2014 raid-check
-rw-r--r--. 1 root root 235 Jan 27 2014 sysstat
-rw-r--r--. 1 root root 187 Jan 28 2014 unbound-anchor
# 先让我们来看看 0hourly 这个配置文件的内容
[root@server ~]# 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
# 内容跟 /etc/crontab 几乎一模一样,但实际上由设置值,就是最后一行
上面表格中提到的最后一行,每隔整点的一分会执行【run-parts /etc/cron.hourly】这个命令。那什么是 run-parts 呢?run-parts 其实是一个脚本,这个脚本会在大约 5 分钟内随机选一个时间来执行 /etc/crond.hourly 目录内的所有执行文件。因此,放在 /etc/cron.hourly 内的文件,必须是能被直接执行的命令脚本,而不是分、时、日、月、周的设置值。
如果你想要自己开发新的软件,该软件要拥有自己的 crontab 定时命令,就可以将【分种 小时 天 月 周 身份 命令】的配置文件放置到 /etc/cron.d/ 目录下。即vim /etc/cron.d/newfile。
在这种发起方式下,编写的定时任务的删除,需要删除配置文件中的内容
【3】、配置文件/etc/cron.hourly/*、/etc/cron.daily/*、/etc/cron.weekly/*、/etc/cron.monthly/*
- /etc/cron.hourly/*——可以将命令放置到(或链接到) /etc/cron.hourly 目录下。每小时的第一分钟开始后的 5 分钟内,随机取一个时间点来执行,你无须手动取去指定分种、小时、天、月、周。
- /etc/cron.daily/*、/etc/cron.weekly/*、/etc/cron.monthly/*——每日、每周、每月执行一次,但是与 /etc/cron.hourly 不一样的是,这三个目录是由 anacron 所执行的,而 anacron 的执行方式则是放在 /etc/cron.hourly/0anacon 里面的。
3、crontab命令的执行权力的设定
(1)用户黑名单,在此名单中出现的用户不能执行crontab命令——/etc/cron.deny
【1】、编辑配置文件/etc/cron.deny
在/etc/cron.deny中编写xin chen表示xin和chen这两个用户不可以使用crontab命令
[root@server ~]# vim /etc/cron.deny
xin
chen
【2】测试:


但是root用户可以指定他们的任务

(2)用户白名单,只有在此名单中出现的用户才能执行crontab命令(root用户除外),白名单默认不存在,需要自己创建——/etc/cron.allow
【1】、编辑配置文件/etc/cron.allow
在/etc/cron.allow中编写xin chen表示只有xin和chen这两个用户可以使用crontab命令
[root@server ~]# vim /etc/cron.allow
xin
chen
【2】、测试


4、一些注意事项
1、资源分配不均的问题
如果每个流程都在同一个时间启动的话,那么在某个时段,系统会变得相当繁忙。所以这个时候就必须要分别设置,这里以每 五 分钟执行一次为例,可以这样做:
[root@server ~]# vim /etc/crontab 1,6,11,16,21,26,31,36,41,46,51,56 * * * * root CMD1 2,7,12,17,22,27,32,37,42,47,52,57 * * * * root CMD2 3,8,13,18,23,28,33,38,43,48,53,58 * * * * root CMD3 4,9,14,19,24,29,34,39,44,49,54,59 * * * * root CMD42、取消不要的输出现象
【当有执行成果或是执行的选项中有输出的数据时,该数据将会 mail 给 MAILTO 设置的账号】。那么当一个任务一直出错,那么你就会一直收到错误信息,怎么办呢?可以里哟没好【输出重定向】将结果输出到 /dev/null 这个垃圾桶中。
3、周与日月不可同时并存
【你可以分别以周或是月日为单位作为循环,但你不可使用【几月几日且为星期几】的模式任务】。这个意思是说,你不可以编写一个计划任务:
30 12 11 9 5 root /usr/bin/echo "jusy test" <==这是错误的写法。本来你以为 9 月 11 号 且为星期五才会执行这项任务,无奈的是,系统可能判定为每个星期五做一次,或每年的 9 月 11 号分别执行。
五、可唤醒停机期间的工作任务
1、什么是 anacron
anacron 并不是用来替换 crontab 的,anacron 存在的目的是:用于处理非 24 小时运行的 Linux 系统所之行的 crontab ,以及因为某些原因导致的超过时间而没有被执行的任务。
anacron 也是每小时被 crond 执行一次,然后 anacron 再去检测相关的计划任务有没有被执行,如果有超过启贤的任务,就执行该任务,执行完毕或无须执行任何任务时,anacron 就停止。
anacron 是怎么判断定时任务有没有被执行,这就要 anacron 读取的时间记录文件(timestamps)了。anacron 会去分析现在的时间与时间记录文件所记载的上次执行 anacron 的时候,两者比较后若发现有差异,那就是在某些时可没有执行 crontab,此时 anacron 就会开始执行未执行的 crontab 任务了。
2、anacron 与 /etc/anacrontab
anacron 会每个小时被主动执行一次,这是因为 anacron 地配置文件被放置在 /etc/cron.hourly 内
[root@server ~]# cat /etc/cron.hourly/0anacron #!/bin/sh # Check whether 0anacron was run today already if test -r /var/spool/anacron/cron.daily; then day=`cat /var/spool/anacron/cron.daily` fi if [ `date +%Y%m%d` = "$day" ]; then exit 0; fi # 上面地语法在校验前一次执行 anacron 时的时间戳 # Do not run jobs when on battery power if test -x /usr/bin/on_ac_power; then /usr/bin/on_ac_power >/dev/null 2>&1 if test $? -eq 1; then exit 0 fi fi /usr/sbin/anacron -s # 所以其实也仅是执行 anacron -s 的命令。anacron 其实每小时都会被抓出来执行一次,但是担心 anacron 误判时间参数,因此 /etc/cron.hourly/ 里面的 anacron 才会在文件名之前加个 0(0anacron),让 anacron 最先执行,就是为了让时间戳先更新,以避免 anacron 误判 crontab 尚未执行任何任务。
anacron [-sfn] [job]...
anacron [-u] [job]...
选项与参数:
-s:开始连续地执行各项任务(job),会根据时间记录文件地数据判断是否执行。
-f:强制执行,而不去判断时间记录文件地时间戳
-n:立刻执行为执行地任务,而不延迟(delay)等待时间
-u:仅更新时间记录文件地时间戳,二不执行任何任务
job:由 /etc/anacrontab 定义地各项任务名称
接下来,我们看一下 anacron 的配置文件 /etc/anacrontab 的内容:
[root@server ~]# 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 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly # 天数 延迟时间 工作名称定义 实际要执行的命令串[root@server ~]# ls /var/spool/anacron/ cron.daily cron.monthly cron.weekly [root@server ~]# cat /var/spool/anacron/* 20190618 20190611 20190613 # 上面则是三个任务名称的时间记录文件以及记录的时间戳
我们拿 /etc/cron.daily 那一行的设置来说明好了,那四个字段的意义分别是:
- 天数:anacron 执行当前与时间戳(/var/spool/anacron/ 内的时间记录文件)相差的天数,若超过此天数,就准备开始执行;若没有超过此天数,则不予执行后续的命令。
- 延迟时间:若确定超过天数导致要执行计划任务了,那么请延迟执行的时间,因为担心立即启动会有其他资源冲突的问题。
- 工作名称定义:这个没啥意义,只是在 /var/log/cron 里面记录该项任务的名称而已,通常与后续的目录资源名称相同即可。
- 实际要执行的命令串:是不是跟 0hourly 很像?没错,相同的做法,通过 run-parts 来处理。
根据上面的配置文件内容,我们大概知道 anacron 的执行流程应该是这样的(以 cron.daily 为例):
- 由 /etc/anacrontab 分析到 cron.daily 这项任务名称的天数为 1 天;
- 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳;
- 由上个步骤与目前的时间比较,若差异天数为 1 天以上(含 1 天),就准备执行命令;
- 若准备执行命令,根据 /etc/anacrontab 的设置,将延迟 5分钟+3小时(看 START_HOURS_RANGE 的设置);
- 延迟时间过后,开始执行后续命令,即【run -parts /etc/cron.daily】这串命令;
- 执行完毕后,anacron 程序结束。
3、总结 anacron 与 crond 的关系
- crond 会主动读取 /etc/crontab、/var/spool/cron/*、/etc/cron.d/* 等配置文件,并根据【分钟 小时 天 月 周】的时间设置去配置各项计划任务;
- 根据 /etc/cron.d/0hourly 的设置,主动区 /etc/cron.hourly/ 目录下,执行所有在该目录下的执行文件。
- 因为 /etc/cron.hourly/0anacron 这个脚本文件的缘故,主动地每小时执行 anacron ,并调用 /etc/anacrontab 配置文件
- 根据 /etc/anacrontab 的设置,根据每天、每周、没月去分析 /etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly 内的执行文件,以固定周期需要执行的命令。
六、系统临时文件的管理
系统中服务在正常运行中都会产生临时文件 /usr/lib/tmpfiles.d/
(1)vim /usr/lib/tmpfiles.d/*.conf 名字随便起


| d | /mnt/xin | 777 | root | root | 10s |
| 文件类型——目录 | 临时文件所在的目录 | 权限 | 拥有者 | 所属组 | 文件存在的时间 |
(2)systemd-tmpfiles --create /usr/lib/tmpfiles.d/xin.conf 执行配置文件内容
该命令的作用是将/usr/lib/tmpfiles.d/xin.conf中所写的目录中的内容设置为临时文件。

(3)systemd-tmpfiles --clean /usr/lib/tmopiles.d/xin.conf 清理临时文件

该命令是清楚存在10s以上的文件。
注意:删除的是存在10s的文件(10s是从创建时间算起的)
如果文件存在的时间小于设置的存在时间(例如上面的 10s),则这次操作不会删除文件


2615

被折叠的 条评论
为什么被折叠?



