种类
主要分为两种,一种是日常任务,一种是突发任务。Linux 分别使用 at 与 crontab 来解决:
- at :仅执行一次就结束的指令,不过要执行 at 时, 必须要有 atd 这个服务。在某些发行版中,atd 可能默认没有启动,那么 at 这个指令就会失效。不过 CentOS 默认是启动的。
- crontab :所设定的工作将会循环的一直进行下去! 可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外,亦可编辑
/etc/crontab
来支持。 至于让 crontab 可以生效的服务则是 crond 服务
at
首先使用前,我们需要检查 atd 服务是否启动:
➜ ~ systemctl status atd
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since 日 2020-01-26 12:32:48 CST; 5 days ago
Main PID: 1723 (atd)
Tasks: 1
CGroup: /system.slice/atd.service
└─1723 /usr/sbin/atd -f
1月 26 12:32:48 centos-7.shared systemd[1]: Started Job spooling tools.
at 指令的工作流程是这样的:
- 先找寻
/etc/at.allow
这个文件,写在这个文件中的使用者才能使用 at - 如果
/etc/at.allow
不存在,就寻找/etc/at.deny
这个文件,若写在这个 at.deny 的使用者则不能使用 at - 如果两个文件都不存在,那么只有 root 可以使用 at 这个指令。使用 at 时,at 并将任务以文本的方式写入
/var/spool/at/
目录内,该工作便能等待 atd 这个服务的取用与执行了。
at 指令的具体使用方法如下:
$ at [-mldv] TIME
$ at -c 工作号码
选项与参数:
-m :当 at 的工作完成后,即使没有输出讯息,亦以 email 通知使用者该工作已完成。
-l :at -l 相当于 atq,列出目前系统上面的所有该用户的 at 排程;
-d :at -d 相当于 atrm ,可以取消一个在 at 排程中的工作;
-v :可以使用较明显的时间格式栏出 at 排程中的任务栏表;
-c :可以列出后面接的该项工作的实际指令内容。
TIME:时间格式。一般常用的有:23:00 2020-02-01, now + 5 minutes
下面是我的一个简单使用:
➜ ~ at now + 5 minutes
at> cat "Hello" > /test
at>
job 4 at Fri Jan 31 13:58:00 2020
➜ ~ ls /
1 boot etc lib media mythinpool proc run srv tmp var
bin dev home lib64 mnt opt root sbin sys usr
=====五分钟后======
➜ ~ ls /
1 boot etc lib media mythinpool proc run srv test usr
bin dev home lib64 mnt opt root sbin sys tmp var
注意,执行 at 指令的时候,如果是计划任务里使用的是相对目录,那么则其根目录是执行 at 指令所在的目录。为了避免这种问题,所以执行时候最好使用绝对目录。
如果想要删除,请使用:
➜ ~ atq
5 Fri Jan 31 15:42:00 2020 a root
➜ ~ atrm 5
➜ ~ atq
➜ ~
batch
其实 batch 是利用 at 来进行指令的下达,所以你可以在 atq 查到你要执行的 batch 任务。batch 的特点在于:他会在 CPU 的工作负载小于 0.8 的时候,才进行你所下达的任务。
crontab
和 at 类似,我们可以限制允许的账号和拒绝账号,使用/etc/cron.allow
和 /etc/cron.deny
。当用户使用 crontab 这个指令来建立任务之后,该任务就会被纪录到 /var/spool/cron/
。
crontab 的语法如下:
crontab [-u username] [-l|-e|-r]
选项与参数:
-u :只有 root 才能进行这个任务,亦即帮其他使用者建立/移除 crontab 工作排程;
-e :编辑 crontab 的工作内容
-l :查阅 crontab 的工作内容
-r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。
使用后会进入 vim 的编辑界面(修改 /etc/crontab
):
$ crontab -e
# 此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。
0 12 * * * mail -s "at 12:00" dmtsai < /home/dmtsai/.bashrc
分 时 日 月 周 |<==============指令串========================>|
注意,这里面周代表的是周几的意思(取值从 0-7,0和7都是星期天)。还有,日月和周同时写并不是同时满足日月周才会执行,而是满足了日月或者周都会执行。即:15 12 12 15 5 既会在12月15日执行,也会在周五执行
还有一些特殊符号:
特殊字符 | 代表意义 |
---|---|
* | 代表任何时刻都接受的意思 |
, | 代表分隔时段的意思。 3,6 代表3点6点都可以 |
- | 代表一段时间范围内。 |
/n | 每隔 n 个时间间隔的意思。例如每五分钟进行一次:*/5,
前面那个是时间范围,也可以是 * |
anacron
anacron 也是每个小时被 crond 执行一次,然后 anacron 再去检测相关的排程任务有没有被执行,如果有超过期限的工作在, 就执行该排程任务,执行完毕或无须执行任何排程时,anacron 就停止了。
比如:你的系统每天凌晨都会备份一次,但不过周五下班的时候你都会进行关机,周一来上班的时候才会开机。这么说整个周五你的操作都没有进行备份,然后周一来的时候你可能改错了什么,然后你需要返回之前的备份,但你最多只能返回到周四的备份(因为周五你没有备份)。
amacron 就是为了解决这种未执行的 crontab 任务,他会分析上次执行 anacron 的时间,若发现有差异, 说明某些时刻没有执行 crontab 。此时 anacron 就会开始执行未进行的 crontab 任务了。