Linux-例行性工作排程

时间:2021-05-10 07:59:45

1. 例行性工作排程的种类

  • 一种是例行性的,即每隔一定的周期要执行一次的;
  • 一种是突发性的,即只要做一次就好啦。

  为了要达成以上两个功能,就要使用at和crontab这两个指令啦。

  • at : at是处理仅运行一次就结束排程的命令,不过要运行 at,必须要有 atd 这个服务的支持才行,atd 可能默认并没有启动,那么 at 这个命令就会失效。
  • crontab : crontab 这个命令所配置的任务将会循环一直执行,可循环的时间有分钟、小时、每周、每月或每年等。crontab 除了可以使用命令运行外,亦可编辑 /etc/crontab 来支持。同理,如果要让 crontab 生效,必须有 crond 这个服务支持才行。

2. 运行一次的工作排程

2.1 atd 服务

  在开始使用 at 命令之前,需要查看一下 atd 这个服务是否正在运行:

[root@www ~]# service atd status

2.2 at 指令

  工作排程,其实就是通过某种方式产生工作,并且将这些工作排进行程表中;我们使用 at 这个命令来产生所要运行的工作,并将这个工作以文字档的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与运行。

  另外,我们对使用 at 这个指令的账户也是存在限制的,主要通过 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制,加上这两个文件后, at 的工作情况是这样的:

  1. 先找 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);
  2. 如果 /etc/at.allow 不存在,就找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 啦;
  3. 如果两个文件都不存在,那么只有 root 可以使用 at 这个命令。
[root@www ~]# at [-mldv] TIME
[root@www ~]# at -c 任务工作号
选项与参数:
-m  :当 at 的工作完成后,即使没有输出信息,也以 email 通知使用者该工作已完成。
-l  :at -l 相当於 atq,列出目前系统上面的所有该使用者的 at 排程;
-d  :at -d 相当於 atrm ,可以取消一个在 at 排程中的工作;
-v  :可以使用较明显的时间格式列出 at 排程中的工作列表;
-c  :可以列出后面接的该项工作的实际命令内容。

TIME:时间格式,这里可以定义出“什么时候要进行 at 这项工作”的时间,格式有:
  HH:MM                ex> 04:00
    在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此工作。
  HH:MM YYYY-MM-DD        ex> 04:00 2009-03-17
    强制规定在某年某月的某一天的特殊时刻进行该工作!
  HH:MM[am|pm] [Month] [Date]    ex> 04pm March 17
    也是一样,强制在某年某月某日的某时刻进行!
  HH:MM[am|pm] + number [minutes|hours|days|weeks]
    ex> now + 5 minutes    ex> 04pm + 3 days
    就是说,在某个时间点,再加几个时间后才进行。
范例:再过五分钟后,将输出输入到文件/tmp/test.txt中
[root@www ~]# at now + 5 minutes
at> echo "Hello" > /tmp/test.txt
at> <EOT>   <==这里输入 [ctrl] + d 就会出现 <EOF> 的字样,代表结束。
job 4 at 2016-03-14 15:38
# 上面这行信息说明,第 4 个 at 工作将在 2016/03/14 的 15:38 进行!

  当我们使用 at 时会进入一个 at shell 的环境来让使用者下达工作命令,此时,最好使用绝对路径来下达你的命令,因为命令的下达与 PATH 变量有关, 同时与当时的工作目录也有关连,因此使用绝对路径来下达命令,会是一个一劳永逸的方法。

  因为 at 的运行与终端机环境无关,而所有 standard output/standard error output 都会传送到运行者的 mailbox 去,终端机是看不到任何信息的。如果需要将信息输出到当前终端机上,则需要指定,例如,如果当前在 tty1 登陆,就使用echo "Hello" > /dev/tty1 即可。

  at 指定的工作是背景运行的,在使用 at 时,系统会将该项 at 工作独立出当前 bash 环境中,直接交给系统的 atd 程序来接管,因此,当下达了 at 的工作之后就可以立刻离线了,剩下的工作就完全交给 Linux 管理即可。

2.3 at 工作的管理

[root@www ~]# atq <== 查看目前主机上面有多少的 at 工作排程
[root@www ~]# atrm jobnumber <== 将相应的工作移除

2.4 batch

  batch 下达的工作排程将会在系统有空时才进行背景任务,其实也是利用 at 来进行命令的下达,只是加入了一些控制参数。这个指令会在 CPU 工作负载小于 0.8 的时候,才进行所下达的工作任务。

 

3. 循环运行的例行性工作排程

3.1 cron (crond) 系统服务

  循环运行的例行性工作排程是由 cron (crond) 这个系统服务来控制的,在使用指令crontab时,需要先查看这个服务是否启动了。

3.2 crontab 指令的运行方式

  crontab 命令也是存在使用限制的,它也是通过文件 /etc/cron.allow 和 /etc/cron.deny 两个文件来做限制的,具体的规则同 at 指令的限制。

  使用 crontab 这个命令创建工作排程之后,该项工作将会被记录到 /var/spool/cron/ 里,而且是以帐号来作为判别的。举例来说,wy 使用 crontab 后, 他的工作会被记录到 /var/spool/cron/wy 里,但需要注意的是,不要使用 vi 直接编辑该文件, 因为可能由于输入语法错误,会导致无法运行 cron 。另外,cron 运行的每一项工作都会被纪录到 /var/log/cron 这个登录档中,所以,如果你的 Linux 不知道有否被植入木马时,也可以搜寻一下 /var/log/cron 这个登录档。

[root@www ~]# crontab [-u username] [-l|-e|-r]
选项与参数:
-u  :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程;
-e  :编辑 crontab 的工作内容
-l  :查阅 crontab 的工作内容
-r  :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。
范例:用 wy 的身份在每天的 12:00 发信给自己
[wy@www ~]$ crontab -e
# 此时会进入 vi 的编辑画面让您编辑工作,每项工作都是一行。
0   12  *  *  * mail wy -s "at 12:00" < /home/wy/.bashrc
#分 时 日 月 周 |<==============命令串========================>|

  每项工作 (每行) 的格式都是具有六个栏位,这六个栏位的意义为:

代表意义

分钟 小时 日期 月份 命令
数字范围 0-59 0-23 1-31 1-12 0-7(0或7代表周日) 命令

  一些辅助的特殊字符的含义:

特殊字符 代表意义
*(星号) 代表任何时刻都接受
,(逗号) 代表分隔时段
-(减号) 代表一段时间范围内
/n(斜线) 那个 n 代表数字,即是每隔 n 单位间隔的意思

3.3 系统的配置档: /etc/crontab

  cron 这个服务的最低侦测限制是“分钟”,所以 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容,因此,只要编辑完 /etc/crontab 这个文件,并且将它储存之后,那么 cron 的配置就自动的会来运行。

  这里着重说一下 run-parts 这个命令,它的作用是将后面接的目录内的所有文件拿出来运行。

3.4 注意事项

  • 资源分配不均的问题
  • 取消不要的输出项目
  • 安全的检验
  • 周与日月不可同时并存

4. 可唤醒停机期间的工作任务

  如果我们的 Linux 主机不是作为 24 小时全天、全年无休的服务器之用的,那么可能就会有一些工作排程无法在我们的机器上按时执行了,那这些停机期间的工作任务如何来完成呢?这个时候我们就需要 anacron 这个指令来帮助我们开机时来运行未进行的crontab任务。

  anacron 存在的目的就是处理非24小时一直启动的Linux系统的crontab的运行。
  anacron 并不能指定何时运行某项任务,而是以天为单位或者是在启动后立刻进行 anacron 的动作,他会去侦测停机期间应该进行但是并没有进行的crontab任务,并将该任务运行一遍后,anacron就会自动停止。

  anacron 会以一天、七天、一个月为期去侦测系统未进行的crontab任务。

  anacron 的工作原理:anacron 会去分析现在的时间与时间记录档所记载的上次运行 anacron 的时间,两者比较后若发现有差异,那就是在某些时刻没有进行 crontab任务。此时 anacron 就会开始运行未进行的 crontab任务了。所以 anacron 其实也是透过 crontab 来运行的。因此 anacron 运行的时间通常有两个,一个是系统启动期间运行,一个是写入 crontab 的排程中。这样才能够在特定时间分析系统未进行的 crontab 任务。

4.1 anacron 与 /etc/anacrontab

  anacron 其实是一支程序而不是一个服务,这支程序在 CentOS 当中已经进入 crontab 的排程中。

  anacron 的语法:

[root@www ~]# anacron [-sfn] [job]..
[root@www ~]# anacron -u [job]..
选项与参数:
-s  :开始一连续的运行各项工作 (job),会依据时间记录档的数据判断是否进行;
-f  :强制进行,而不去判断时间记录档的时间戳记;
-n  :立刻进行未进行的任务,而不延迟 (delay) 等待时间;
-u  :仅升级时间记录档的时间戳记,不进行任何工作。
job :由 /etc/anacrontab 定义的各项工作名称。