一、 单次任务
https://www.jianshu.com/p/066f6aa07898
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
按下
Ctrl+d
键退出编辑
查询
[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 的定义啦!