at 命令

用途

稍后运行命令。

语法

将作业调度为稍后运行
at [ -c | -k | -s | -q Queue ] [ -m ] [ -f File ] { -t Date |Time [ Day ] [ Increment ] }
要报告已调度作业
at -l [ -v ] [ -o ] [ Job ... | -q Queue ]
at -n [ User ]
要除去已调度作业
at -r [ -F ] [ -i ] Job ...
at -r [ -F ] [ -i ] -u User

描述

at 命令从标准输入中读取以后要运行的命令的名称,并允许用户指定必须运行命令的时间。

除非您重定向,否则 at 命令将有关已调度命令的标准输出和标准错误发送给您。 它还将作业号和已调度时间写至标准错误。

当执行 at 命令时,它保留当前进程环境。 它不保留打开的文件描述符、陷阱和优先级。

/var/adm/cron/at.allow/var/adm/cron/at.deny 文件控制哪些用户可以使用 at 命令。 具有 root 用户权限的用户可以创建、编辑或删除这些文件。 这些文件中的条目是用户登录名,每行一个名称。 以下是 at.allow 文件的示例:

root
nick
dee
sarah

如果 at.allow 文件存在,那么只有登录名显示在其中的用户才能使用 at 命令。 系统管理员可以通过在 at.deny 文件中列出用户的登录名来显式阻止用户使用 at 命令。 如果只存在 at.deny 文件,任何其名称不出现在该文件中的用户可以使用 at 命令。

如果下列其中一项为真,那么用户不能使用 at 命令:

  • at.allow 文件和 at.deny 文件不存在(仅允许 root 用户)。
  • at.allow 文件存在,但用户登录名没有在文件中列出。
  • at.deny 文件存在,且用户登录名列在其中。

如果 at.allow 文件不存在且 at.deny 文件不存在,那么只有具有 root 用户权限的用户才能使用 at 命令提交作业。

要安排作业稍后运行,您必须指定要启动此作业的时间。 可以通过使用 -t Date 标志或 TimeDayIncrement 参数来指定时间。 可将任意数目的作业安排为最多每秒运行 60 个。

使用以下格式指定 -t 标志的 Date 变量:

[ [CC ]YY] MMDDhhmm [.SS ]

Date 变量中的数字如下定义:

表 1. 项
描述
CC 指定年份的前两位数字(纪元)。
YY 指定年份的后两位数字。
MM 指定一年的月份(01 到 12)。
DD 指定一月中的具体日子(01 到 31)。
hh 指定一天中的小时数 (00 到 23)。
mm 指定小时的分钟数 (00 到 59)。
SS 指定一分钟中的具体秒数(00 到 59)。

CC YY 数字是可选的。 如果两者都不给出,那么假定为当前年份。 如果指定 YY,但未指定 CC,那么 CC 数字如下定义:

  • 如果 YY 数字的值在 70 和 99 之间,那么假定 CC 数字的值为 19。
  • 如果 YY 数字的值在 00 和 37 之间,那么假定 CC 数字的值为 20。
  • SS 的缺省值是 00。

    对于在 2038 和 2105 之间的年份,请采用 yyyy 格式指定年份。

最终生成的时间受到 TZ 环境变量的值的影响。

Time 参数可指定为后跟可选后缀的数字。 at 命令将一位和二位数字解释为小时。 它将四位数字解释为小时和分钟。 LC_TIME 语言环境范畴中的 T_FMT 项指定小时和分钟的顺序。 缺省顺序是:小时后跟分钟。 您还可以使用以下命令分隔小时和分钟: (Colon)。 缺省顺序是小时:分钟

另外,您可以指定下列其中一个后缀:

  • 上午
  • pm
  • 祖鲁语

如果不指定 ampmat 命令使用 24 小时制时钟。 这些后缀可以跟在时间之后作为单独的参数或用空格隔开。 ampm 后缀是来自 LC_TIME 语言环境范畴中 AM_STR PM_STR 项的定义值。 后缀 zulu 指示时间为 GMT (格林威治标准时间)。

at 命令还识别以下作为 Time 参数特殊值的关键字:

  • 中午
  • midnight
  • 现在
  • A 表示 AM
  • PM 的 P
  • N 表示中午
  • M 表示午夜

您可以将可选的 Day 参数指定为月名和日号 (可能是以逗号开头的年号) 或星期几。 LC_TIME 语言环境范畴中的 D_FMT 项指定了月和日的顺序(缺省情况下,日跟在月之后)。 LC_TIME 语言环境范畴中的 DAY_1DAY_7 项指定了长日期名。 LC_TIME 语言环境范畴中的 ABDAY_1ABDAY_7 项指定了短日期名。 LC_TIME 语言环境范畴中的 MON_1MON_12 项指定了长月份名。 LC_TIME 语言环境范畴中的 ABMON_1ABMON_12 项指定了短月份名。 缺省情况下,长名完全拼写出来;而对于工作日短名缩写为两个或更多字符,对于月份,短名则缩写为三个字符。

at 命令识别 todaytomorrow 作为 Day 参数的特殊缺省值。 如果指定的时间晚于当前时间,那么 today 值是 Day 的缺省值;如果指定时间早于当前时间,那么 tomorrow 值是缺省值。 如果指定月份早于当前月份(且没有给出年份),那么明年是缺省年份。

标志

表 2。 标志
描述
-c 请求使用 csh 命令来执行此作业。
-f File 使用指定文件而非用标准输入作为输入。
-F 禁止删除验证。 将此标志与 -r 标志配合使用。
-i 指定交互式删除。 将此标志与 -r 标志配合使用。
-k 请求使用 ksh 命令来执行此作业。
-l 报告已调度的作业。 如果您具有 root 用户权限,那么您可以获取其他用户发出的作业。
-m 发送给用户有关成功执行命令的消息。
-n [ User ] 报告您的队列或用户的队列中的文件数。
-o 按调度顺序列出作业。 此标志仅和 -l 标志一起使用才有效。
-q 队列 指定在哪个队列中调度要提交作业。 当和 -l 标志一起使用时,报告限于 Queue 变量指定的队列。 缺省情况下,at 作业在 a 队列中调度。 b, cd 队列分别为 batch个作业, cron 个作业和 sync 个作业保留。
-q a
at 作业进行排队。
-q b
batch 作业进行排队。 batch 命令使用此标志调用 at 命令。
注: 使用 b 队列时,将从标准输入中读取命令。 同样,now 关键字用于 Time 参数而不考虑您在命令行指定的内容。
-q e
ksh 作业进行排队。 等同于 -k 标志。
-q f
csh 作业进行排队。 等同于 -c 标志。
-q g-z
对用户定义的队列作业进行排队。
-r 作业... 除去先前由 atbatch 命令调度的 作业 ,其中 作业 是由 atbatch 命令分配的编号。 如果您没有 root 用户权限 (请参阅 su 命令) ,那么只能除去您自己的作业。 atrm 命令可供 root 用户用于除去由其他用户发出的作业或由特定用户发出的所有作业。
-s 请求使用 bsh 命令 (Bourne shell) 来执行此作业。
-t 日期 提交作业,以便在 日期 变量指定的时间运行。
-u 用户 删除指定用户的所有作业。 如果与 -r 标志一起使用,请不要指定 Job 变量 (正确的语法为 at -r -u User)。
-v -l 标志配合使用以显示列出的作业的内容。

参数

表 3。 参数
描述
将可选的 Day 参数指定为月名和日号 (可能是以逗号开头的年号) 或星期几。
增量 可选 Increment 参数可以是下列其中一项:
  • +(加号),后跟一个数字和下列其中一个单词:
    • [s]
    • hour[s]
    • [s]
    • 星期[s]
    • 个月[s]
    • [s]
  • 特殊字 next 后跟下列其中一个单词:
    • [s]
    • hour[s]
    • [s]
    • 星期[s]
    • 个月[s]
    • [s]

安全性

审计事件

如果正确地配置和启用了审计子系统,那么 at 命令就会在每次运行时生成以下审计记录或事件:

表 4。 审计事件
事件 信息
AT_JobAdd 列出 at 正运行的作业、任务完成的时间和发出该命令的用户。

有关如何正确选择和分组审核事件以及如何配置审核事件数据收集的更多详情,请参阅在安全中设置审核。

RBAC 用户
RBAC 用户注意: 此命令可以执行特权操作。 只有特权用户才能执行特权限定的操作。 有关授权和权限的更多信息,请参阅安全中的特权命令数据库。 有关该命令的权限和授权列表,请参阅 "lssecattr命令或 "getcmdattr子命令。

退出状态

本命令返回以下退出值:

表 5。 退出状态
描述
重大安全事件数量 at 命令成功提交、除去或列出一个或多个作业。
>0 发生错误。

示例

  1. 要从终端调度命令,请输入类似下列其中之一的命令:

    如果 uuclean 位于当前目录中,请输入:

    at   5   pm   Friday
    uuclean
    <Ctrl-D>
     
    at   now   next   week
    uuclean
    <Ctrl-D>

    如果 uuclean 位于 $HOME/bin/uuclean中,请输入:

    at   now   +   2   days
    $HOME/bin/uuclean
    <Ctrl-D>
    注: 在命令行上输入命令名作为最后一项时,如果命令不在当前目录中,那么必须提供完整路径名,并且 at 命令将不接受任何参数。
  2. 要在 1 月 24 日下午 3:00 运行 uuclean 命令,请输入以下任一命令:
    echo   uuclean   |   at   3:00   pm   January   24
     
    echo   uuclean   |   at   3 pm   Jan   24
     
    echo   uuclean   |   at   1500   jan   24
  3. 要作业自己重新调度,那么通过将类似于以下内容的代码包含在 shell 文件中并且从 shell 过程中来调用 at 命令:
    echo   "ksh   shellfile"   |   at   now   tomorrow
  4. 要列出您已发送的稍后要运行的作业,请输入:
    at -l
  5. 要取消一个作业,请输入:
    at -r ctw.635677200.a

    这将取消作业 ctw.635677200.a。 使用 at -l 命令可列出分配给作业的作业号。

文件

表 6。 文件
描述
/var/adm/cron/FIFO 命名管道,使用 crontabat 命令提交新作业时,它会将消息发送到 cron 守护程序。
/usr/bin/at 包含 at 命令。
/var/adm/cron 包含主 cron 目录。
/var/adm/cron/at.allow 指定许可用户的列表。
/var/adm/cron/at.deny 指定被拒绝用户的列表。
/var/spool/cron/atjobs 包含 at 的假脱机区域目录。