Bonky Zhu
If someone is able to show me that what I think or do is not right, I will happily change, for I seek the truth, by which no one was ever truly harmed. It is the person who continues in his self-deception and ignorance who is harmed.

Linux 定时任务

种类

主要分为两种,一种是日常任务,一种是突发任务。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 指令的工作流程是这样的:

  1. 先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at
  2. 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at
  3. 如果两个文件都不存在,那么只有 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 任务了。

Share

You may also like...

发表评论