14.计划任务

一、 单次任务

atd 服务负责管理单次任务

进行单次任务的程序是 at 命令, 管理他的服务是 atd

systemctl restart atd 
systemctl enable atd
systemctl status atd

工作方式

我们使用 at 这个指令来产生所要运行的工作,并将这个工作以文本文件的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与执行了

实际上有两个权限控制文件,规定了哪些用户可以使用,哪些用户不可以使用

规则是这样的:
一行一个用户

  1. 首先查看 /etc/at.allow 文件。
    假如系统中存在此文件,就只允许在此文件的用户使用 at, 其他都拒绝。

  2. 假如没有 /etc/at.allow 文件,就看有没有 /etc/at.deny 文件。
    这个文件意义就是,允许所有,拒绝部分。
    就是在这个文件中的用户是被拒绝的,不在此文件中的用户是被允许的。

  1. 默认CentOS7系统是有一个空的 /etc/at.deny 文件。
    意思是允许所有人使用 at 命令的意思。

具体操作

[root@study ~]# at [-mldv] TIME
[root@study ~]# at -c 工作号码
选项与参数:
-m  :当 at 的工作完成后,即使没有输出讯息,亦以 email 通知使用者该工作已完成。
-l  :at -l 相当于 `atq` 命令,列出目前系统上面的所有该使用者的 at 调度;
-d  :at -d 相当于 `atrm` 命令 ,可以取消一个在 `at` 调度中的工作;
-v  :可以使用较明显的时间格式列出 at 调度中的工作列表;
-c  :可以列出后面接的该项工作的实际指令内容。

TIME:

时间格式,可以定义出『什么时候要进行 at 这项工作』的时间.

格式有:

HH:MM 如: 04:00
在今日的 HH:MM 进行,若时间已过,则在明天的 HH:MM 进行行此工作。

HH:MM YYYY-MM-DD 如: 04:00 2019-07-28
强制在某年某月的某一天的特殊时刻进行该工作!

HH:MM[am|pm] + number [minutes|hours|days|weeks]
如:
now + 5 minutes

04pm + 3 days
就是说,在某个时间点『再加上几个时间后』才进行。

示例:

创建

[root@kvm-docker ~]# at now + 5 minutes
at> echo "hello" > /dev/pts/0
at> <EOT>
job 1 at Sat Jul 27 18:49:00 2019

查询

[root@kvm-docker ~]# atq
1   Sat Jul 27 18:49:00 2019 a root

二、周期性的任务

就是 计划任务

循环执行的例行性工作调度则是由 cron (crond) 这个系统服务来控制的。

默认情况下,每个用户都可以通过 crontab 管理自己的计划任务。

at 一样,有两个文件控制权限。

  • /etc/cron.allow
  • /etc/cron.deny

使用规则是和之前的 at 的文件一样。
/etc/cron.allow/etc/cron.deny 要优先, 请永远用一个文件进行控制,别给自己找麻烦!

crontab -e 设置格式

命令格式的前一部分是对时间的设定
后面一部分是要执行的命令。

关于时间

参考: cat /etc/crontab

代表意义 分钟 小时 日期 月份 指令
数字范围 0-59 0-23 1-31 1-12 0-7 命令

周的数字为 07 时,都代表“星期天”的意思!
总结记忆:
分 时 日 月 星

除了数字还有几个个特殊的符号:

就是 */-,

  • *代表所有的取值范围内的数字
  • / 代表每的意思,*/5 表示每5个单位
  • - 代表从某个数字到某个数字
  • , 代表分隔时段的意思,就是 的意思

以下举几个例子说明:

每天早上6点:
0 6 * * * command

每两个小时:
0 */2 * * * command

23 点到早上7点之间每两个小时, 并且还有早上8点:
0 23-7/2,8 * * * command

每个月的 4 号的早上11点和每周的周一到周三的早上11点:
0 11 4 * 1-3 command

1月1日早上2点 30 分:
30 2 1 1 * command

管理当前用户的计划任务

创建/再次编辑

这会调用 `vi` 打开一个临时文件
➜  ~ crontab -e
*/1 * * * *  /bin/echo "ok shark"

编辑好后,想使用 vi 一样保存退出。
保存后,这个信息会被保存在 /var/spool/cron/ 目录下的和用户同名的文件中。
比如目前操作的用户是 sharkshark 的计划任务会别保存在 /var/spool/cron/shark 文件中。
这个文件每个用户只有一个。

查看

➜  ~ crontab -l
*/1 * * * * /bin/echo "ok shark"
➜  ~ cat /var/spool/cron/root
*/1 * * * * /bin/echo "ok shark"

修改/删除一个

再次使用 crontab -e 命令利用 vi 进行修改和删除单个计划任务。

删除全部

crontable  -r

cron 的系统级别的配置文件

/etc/crontab/etc/cron.d/*

/etc/crontab

➜  ~ 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

MAILTO=root
就是执行这个计划任务的命令出错时,或者是该计划任务的执行结果有 STDOUT/STDERR 时,将这些信息发送给 root 用户。
一般改成自己的账户 [email protected]

user-name
执行后面命令的 身份账户
/etc/crontab 里面当然要指定身份

/etc/cron.d/*

在此目录下的所有文件都会被 crond 服务识别为一个计划任务的列表文件。

➜  ~ ls /etc/cron.d/
0hourly
这个文件,crond 会从 1 到 5 分钟,随机挑选一个时间执行这个文件中的计划任务。
➜  ~ cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bashin/
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly

run-parts 脚本会在大约 5 分钟内随机选一个时间来执行 /etc/cron.hourly 目录内的所有可执行文件
也就是说这里的计划任务是:
以 root 用户的身份,每个小时的第 1 分钟执行 /etc/cron.hourly 目录下的所有脚本。
/etc/cron.hourly 目录下必须是可执行文件。

最佳实战

  1. 不要在统一时间段执行多个计划任务

  2. 将命令的错误输出重定向

*/1   *   *   *   *   /bin/echo  "hello"      2> /dev/null
  1. 周与日月不可同时并存

anacron

作用

anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于我们上头提到的,在处理非 24 小时一直启动的 Linux 系统的 crontab 的执行! 以及因为某些原因导致的超过时间而没有被执行的调度工作。

其实 anacron 也是每个小时被 crond 执行一次,然后 anacron 再去检测相关的调度任务有没有被执行,如果有超过期限的工作在, 就执行该调度任务,执行完毕或无须执行任何调度时,anacron 就停止了。

crond 与 anacron 的关系:

  1. crond 会主动去读取 /etc/crontab, /var/spool/cron/, /etc/cron.d/ 等配置文件,并依据“分、时、日、月、周”的时间设置去各项工作调度;

  2. 根据 /etc/cron.d/0hourly 的设置,主动去 /etc/cron.hourly/ 目录下,执行所有在该目录下的可执行文件;
    因为 /etc/cron.hourly/0anacron 这个指令档的缘故,主动的每小时执行 anacron ,并调用 /etc/anacrontab 的配置文件;

  3. 根据 /etc/anacrontab 的设置,依据每天、每周、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 内的可执行文件,以进行固定周期需要执行的指令。

也就是说,如果你每个周日的需要执行的动作是放置于 /etc/crontab 的话,那么该动作只要过期了就过期了,并不会被抓回来重新执行。但如果是放置在 /etc/cron.weekly/ 目录下,那么该工作就会定期,几乎一定会在一周内执行一次~如果你关机超过一周,那么一开机后的数个小时内,该工作就会主动的被执行喔! 真的吗?对啦!因为 /etc/anacrontab 的定义啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章