1. 例行性工作排程的种类
- 一种是例行性的,即每隔一定的周期要执行一次的;
- 一种是突发性的,即只要做一次就好啦。
为了要达成以上两个功能,就要使用at和crontab这两个指令啦。
- at : at是处理仅运行一次就结束排程的命令,不过要运行 at,必须要有 atd 这个服务的支持才行,atd 可能默认并没有启动,那么 at 这个命令就会失效。
- crontab : crontab 这个命令所配置的任务将会循环一直执行,可循环的时间有分钟、小时、每周、每月或每年等。crontab 除了可以使用命令运行外,亦可编辑 /etc/crontab 来支持。同理,如果要让 crontab 生效,必须有 crond 这个服务支持才行。
2. 运行一次的工作排程
2.1 atd 服务
在开始使用 at 命令之前,需要查看一下 atd 这个服务是否正在运行:
[[email protected] ~]# service atd status
2.2 at 指令
工作排程,其实就是通过某种方式产生工作,并且将这些工作排进行程表中;我们使用 at 这个命令来产生所要运行的工作,并将这个工作以文字档的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与运行。
另外,我们对使用 at 这个指令的账户也是存在限制的,主要通过 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制,加上这两个文件后, at 的工作情况是这样的:
- 先找 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);
- 如果 /etc/at.allow 不存在,就找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 啦;
- 如果两个文件都不存在,那么只有 root 可以使用 at 这个命令。
[[email protected] ~]# at [-mldv] TIME [[email protected] ~]# 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中 [[email protected] ~]# 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 工作的管理
[[email protected] ~]# atq <== 查看目前主机上面有多少的 at 工作排程 [[email protected] ~]# 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 这个登录档。
[[email protected] ~]# crontab [-u username] [-l|-e|-r] 选项与参数: -u :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程; -e :编辑 crontab 的工作内容 -l :查阅 crontab 的工作内容 -r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。
范例:用 wy 的身份在每天的 12:00 发信给自己 [[email protected] ~]$ 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 的语法:
[[email protected] ~]# anacron [-sfn] [job].. [[email protected] ~]# anacron -u [job].. 选项与参数: -s :开始一连续的运行各项工作 (job),会依据时间记录档的数据判断是否进行; -f :强制进行,而不去判断时间记录档的时间戳记; -n :立刻进行未进行的任务,而不延迟 (delay) 等待时间; -u :仅升级时间记录档的时间戳记,不进行任何工作。 job :由 /etc/anacrontab 定义的各项工作名称。