代码改变世界

at定时执行任务命令详解

2016-11-14 17:07  spinxy  阅读(4216)  评论(0编辑  收藏  举报

本文内容是对man at的翻译和使用整理

  • 在linux中crontab用于处理周期性的任务而at则是处理仅执行一次的任务
  • at命令用于在指定时间执行命令
  • at允许使用一套相当复杂的指定时间的方法,它能够接受在当天的hh:mm(小时:分钟)式的时间指定,假如该时间已过去,那么就放在第二天执行
  • 可以使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间
  • 可以采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午
  • 能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面

上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的
指定格式为:now + count time-units

  • now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)
  • count是时间的数量,究竟是几天,还是几小时,等等
  • 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间

检查at是否安装

在使用前先使用whereis命令检查at命令是否安装,如果没有安装执行下面的yum命令进行安装(安装过程输出内容省略)

[root@a ~]# yum provides at
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
at-3.1.10-48.el6.x86_64 : Job spooling tools
Repo        : base
Matched from:

[root@a ~]# yum -y install at-3.1.10-48.el6.x86_64

开启atd服务并设置开机自动启动

centos6:

[root@a ~]# service atd start
Starting atd:                                              [  OK  ]
[root@a ~]# service atd status
atd (pid  1832) is running...
[root@a ~]# chkconfig --level 3 atd on
[root@a ~]# chkconfig --list | grep atd
atd            	0:off	1:off	2:off	3:on	4:on	5:on	6:off

相关命令

  • at:在特定的时间执行一次性的任务
  • atq:列出用户的计划任务,如果是超级用户将列出所有用户的任务,结果的输出格式为:Job number, date, hour, queue, and username
  • atrm:根据Job number删除at任务
  • batch:在系统负荷允许的情况下执行at任务,换言之,就是在系统空闲的情况下才执行at任务

命令选项

-m:当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
-M:不发送邮件
-l:atq的别名
-d:atrm的别名
-r:atrm的别名
-v:显示任务将被执行的时间,显示的时间格式为:Thu Feb 20 14:50:00 1997
-c:打印任务的内容到标准输出
-V:显示版本信息
-q:后面加<队列> 使用指定的队列
-f:后面加<文件> 从指定文件读入任务而不是从标准输入读入
-t:后面<时间参数> 以时间参数的形式提交要运行的任务

对队列的补充:

  • -q选项后面跟上队列名称将使用指定的队列执行at任务
  • 队列名称只包含一个字母,有效的队列名称取值范围是:小写字母a-z或大写字母A-Z
  • 在默认情况下a队列作为at命令的默认队列,b队列作为batch命令的默认队列
  • 越大的字母在执行时拥有越高的优先级
  • "="是作为特殊队列保留给当前运行的at任务使用的
  • 如果在创建at计划任务是使用大写字母指定任务的队列,该任务在执行的时候将被当做batch计划任务处理
  • 使用atq查询at任务时如果指定了队列名称,查询的结果只会包含这个队列下的任务

对-t选项的补充:

  • -t选项的作用是在指定的time_arg时间参数对应的时刻执行at任务
  • 这个参数后面的时间的格式必须和touch命令-t选项所需的时间的格式一致
  • time_arg的格式为[[CC]YY]MMDDhhmm[.ss]
CC 指定年份的前两位数字
YY 指定年份的后两位数字
MM 指定一年的哪一月(从 01 到 12)
DD 指定一月的哪一天(从 01 到 31)
hh 指定一天中的哪一小时(从 00 到 23)
mm 指定一小时的哪一分钟(从 00 到 59)
ss 指定一分钟的哪一秒(从 00 到 59)

相关配置文件

  • 时间规范的确切定义可以在/usr/share/doc/at-3.1.10/timespec中查看
  • root用户可以在任何情况下使用at命令,而其他用户使用at命令的权限定义在/etc/at.allow和/etc/at.deny文件中
  • 如果/etc/at.allow文件存在,只有在该文件中的用户名对应的用户才能使用at
  • 如果/etc/at.allow文件不存在,/etc/at.deny存在,所有不在/etc/at.deny文件中的用户可以使用at
  • 如果/etc/at.allow和/etc/at.deny文件都不存在,只有root用户能使用at
  • 一个空内容的/etc/at.deny表示任何用户都能使用at命令,这是默认的配置