Linux运维之系统计划任务及系统临时文件的管理

一、实验环境(rhel7.0版本)

主机环境:rhel7.0

各主机信息

主机名IP
server172.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  的工作情况其实是这样的:

  1. 先找寻  /etc/at.allow  这个文件,写在这个文件中的用户,才能使用  at,没有在这个文件中的用户则不能使用  at(即使没有写在  at.deny  当中);
  2. 如果 /etc/at.allow  不存在,就查找  /etc/at.deny  这个文件,写在这个 at.deny  中的用户则不能使用 at,而没有在这个  at.deny  文件中的用户,就可以使用 at;
  3. 如果这两个文件都不存在,那么只有  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 字样的输出

 

需要注意的几个点:

  1. 事实上,当我们使用  at  时会进入一个  at  shell  的环境来让用户执行任务命令。此时,建议你最好使用绝对路径来执行你的命令,避免出问题。
  2. 如果在 at  shell  内的命令并没有输出任何信息,那么  at  默认不会发 email  给执行者。如果你想让  at  无论如何都发一封  email  告知你是否执行了命令,可以使用 【at  -m  时间格式】来执行命令。
  3. 有些朋友希望【我要在某某时刻,在我的终端显示出 Hello 的字样】,然后就在  at 里面执行这样的信息【/usr/bin/echo   "Hello"】。等时间到了,却没有发现任何信息在屏幕上显示,这是什么原因?这是因为  at  的执行与终端环境无关,而所有标准输出/标准错误输出都会发送到执行者的  mailbox  中,所以在终端上当然看不到任何信息。没关系,可以通过终端的设备来处理。假如你在 tty1 登录,则可以使用【/usr/bin/echo  "Hello"  >  /dev/tty1】来替换。
  4. 由于 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  的工作情况其实是这样的:

  1. 先找寻  /etc/cron.allow  这个文件,写在这个文件中的用户,才能使用  crontab,没有在这个文件中的用户则不能使用  crontab(即使没有写在  cron.deny  当中);
  2. 如果 /etc/cron.allow  不存在,就查找  /etc/cron.deny  这个文件,写在这个 cron.deny  中的用户则不能使用 crontab,而没有在这个  cron.deny  文件中的用户,就可以使用 crontab;
  3. 如果这两个文件都不存在,那么只有  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-590-231-311-120-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  的内容几乎一模一样,只有几个地方不太相同:

  1. SHELL:就是默认使用的 shell
  2. PATH:就是输入执行文件的查找路径
  3. MAILTO:就是当 /etc/crontab  这个文件中的循环计划任务的命令发生错误时,或是该任务的执行结果有标准输出/标准错误时,会将错误信息或是屏幕显示的信息传给谁?默认当然是由系统直接发一封  email  给 root。
  4. 【分钟  小时  天  月   周  身份  命令】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/*

 

  1. /etc/cron.hourly/*——可以将命令放置到(或链接到) /etc/cron.hourly 目录下。每小时的第一分钟开始后的  5  分钟内,随机取一个时间点来执行,你无须手动取去指定分种、小时、天、月、周。
  2. /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 CMD4

2、取消不要的输出现象

【当有执行成果或是执行的选项中有输出的数据时,该数据将会 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  为例):

  1. 由 /etc/anacrontab  分析到 cron.daily  这项任务名称的天数为  1  天;
  2. 由 /var/spool/anacron/cron.daily  取出最近一次执行  anacron 的时间戳;
  3. 由上个步骤与目前的时间比较,若差异天数为  1  天以上(含  1  天),就准备执行命令;
  4. 若准备执行命令,根据  /etc/anacrontab  的设置,将延迟 5分钟+3小时(看 START_HOURS_RANGE 的设置);
  5. 延迟时间过后,开始执行后续命令,即【run  -parts  /etc/cron.daily】这串命令;
  6. 执行完毕后,anacron  程序结束。

 

3、总结 anacron  与 crond  的关系

 

  1. crond  会主动读取 /etc/crontab、/var/spool/cron/*、/etc/cron.d/* 等配置文件,并根据【分钟  小时  天  月  周】的时间设置去配置各项计划任务;
  2. 根据  /etc/cron.d/0hourly 的设置,主动区  /etc/cron.hourly/  目录下,执行所有在该目录下的执行文件。
  3. 因为 /etc/cron.hourly/0anacron  这个脚本文件的缘故,主动地每小时执行  anacron ,并调用 /etc/anacrontab  配置文件
  4. 根据 /etc/anacrontab  的设置,根据每天、每周、没月去分析  /etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly  内的执行文件,以固定周期需要执行的命令。

 

六、系统临时文件的管理

 

系统中服务在正常运行中都会产生临时文件  /usr/lib/tmpfiles.d/

 

(1)vim /usr/lib/tmpfiles.d/*.conf           名字随便起

 

d  /mnt/xin777rootroot10s
文件类型——目录   临时文件所在的目录 权限拥有者所属组 文件存在的时间

 

(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),则这次操作不会删除文件


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值