at与crontab计划任务

一、 单次任务
atd 服务负责管理单次任务
进行单次任务的程序是 at 命令, 管理他的服务是 atd。
systemctl restart atd
systemctl enable atd
systemctl status atd

工作方式
我们使用 at 这个指令来产生所要运行的工作,并将这个工作以文本文件的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与执行了
实际上有两个权限控制文件,规定了哪些用户可以使用,哪些用户不可以使用
规则是这样的:
一行一个用户

首先查看 /etc/at.allow 文件。
假如系统中存在此文件,就只允许在此文件的用户使用 at, 其他都拒绝。
假如没有 /etc/at.allow 文件,就看有没有 /etc/at.deny 文件。
这个文件意义就是,允许所有,拒绝部分。
就是在这个文件中的用户是被拒绝的,不在此文件中的用户是被允许的。

默认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>
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
命令

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

除了数字还有几个个特殊的符号:
就是 *、/ 和 -、, ,

*代表所有的取值范围内的数字

/ 代表每的意思,*/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/ 目录下的和用户同名的文件中。
比如目前操作的用户是 shark , shark 的计划任务会别保存在 /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 * * * * /bin/echo "hello" 2> /dev/null

周与日月不可同时并存

anacron
作用
anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于我们上头提到的,在处理非 24 小时一直启动的 Linux 系统的 crontab 的执行! 以及因为某些原因导致的超过时间而没有被执行的调度工作。
其实 anacron 也是每个小时被 crond 执行一次,然后 anacron 再去检测相关的调度任务有没有被执行,如果有超过期限的工作在, 就执行该调度任务,执行完毕或无须执行任何调度时,anacron 就停止了。
crond 与 anacron 的关系:

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/ 内的可执行文件,以进行固定周期需要执行的指令。

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

作者:xiguatian
链接:https://www.jianshu.com/p/066f6aa07898
来源:
著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的:(at与crontab计划任务)