系统管理指南:高级管理

调度单个系统任务 (at)

以下各节介绍如何使用 at 命令来执行下列任务:

缺省情况下,用户可以创建、显示和删除自己的 at 作业文件。要访问属于 root 或其他用户的 at 文件,您必须具有超级用户权限。

提交 at 作业时,会为该作业分配作业标识号和 .a 扩展名。此指定将成为该作业的文件名,以及其队列编号。

at 命令的说明

提交 at 作业文件需执行以下步骤:

  1. 调用 at 实用程序并指定命令执行时间。

  2. 键入以后要执行的命令或脚本。


    注 –

    如果此命令或脚本的输出很重要,请确保将输出定向到一个文件中,以便以后检查。


例如,以下 at 作业将在 7 月的最后一天接近午夜时删除用户帐户 smithcore 文件。


$ at 11:45pm July 31
at> rm /home/smith/*core*
at> Press Control-d
commands will be executed using /bin/csh
job 933486300.a at Tue Jul 31 23:45:00 2004

控制对 at 命令的访问

您可以设置一个文件来控制对 at 命令的访问,只允许指定的用户创建、删除或显示有关 at 作业的队列信息。控制对 at 命令的访问的文件 /etc/cron.d/at.deny 由用户名列表构成,每个用户名占据一行。此文件中列出的用户不能访问 at 命令。

在 SunOS 软件安装期间创建的 at.deny 文件包含以下用户名:


daemon
bin
smtp
nuucp
listen
nobody
noaccess

使用超级用户权限,您可以编辑 at.deny 文件,以添加要限制其对 at 命令访问的其他用户名。

Procedure如何创建 at 作业

  1. 启动 at 实用程序,指定所需的作业执行时间。


    $ at [-m] time [date] 
    -m

    在作业完成后发送邮件。

    time

    指定要调度作业的小时。如果不按 24 小时制指定小时,请添加 ampm。可接受的关键字包括 midnightnoonnow。分钟是可选的选项。

    date

    指定月份的前三个或更多字母、一周中的某日或关键字 todaytomorrow

  2. at 提示符下,键入要执行的命令或脚本,每行一个。

    通过在每行结尾处按回车键,可以键入多个命令。

  3. 按 Ctrl-D 组合键,以退出 at 实用程序并保存 at 作业。

    at 作业将被分配一个队列编号,它也是该作业的文件名。退出 at 实用程序时将显示该编号。


示例 8–7 创建 at 作业

以下示例显示了用户 jones 创建的 at 作业,该作业用于在下午 7:30 删除其备份文件。由于她使用了 -m 选项,因此她会在该作业完成后收到电子邮件。


$ at -m 1930
at> rm /home/jones/*.backup
at> Press Control-D
job 897355800.a at Thu Jul  12 19:30:00 2004

她收到一封确认已执行 at 作业的电子邮件。


Your “at” job “rm /home/jones/*.backup”
completed.

以下示例说明 jones 如何调度在星期六凌晨 4:00 执行的大型 at 作业。该作业输出被定向到名为 big.file 的文件中。


$ at 4 am Saturday
at> sort -r /usr/dict/words > /export/home/jones/big.file

Procedure如何显示 at 队列

  1. 要检查在 at 队列中等待的作业,请使用 atq 命令。


    $ atq
    

    此命令可以显示您已创建的 at 作业的状态信息。

Procedure如何验证 at 作业

  1. 要验证您是否已创建了 at 作业,请使用 atq 命令。在以下示例中,atq 命令确认已将属于 jonesat 作业提交至队列。


    $ atq
    Rank	  Execution Date     Owner     Job         Queue   Job Name
      1st   Jul 12, 2004 19:30   jones  897355800.a     a     stdin
      2nd   Jul 14, 2004 23:45   jones  897543900.a     a     stdin
      3rd   Jul 17, 2004 04:00   jones  897732000.a     a     stdin

Procedure如何显示 at 作业

  1. 要显示有关 at 作业的执行时间信息,请使用 at -l 命令。


    $ at -l [job-id]

    其中,-l job-id 选项表示要显示其状态的作业的标识号。


示例 8–8 显示 at 作业

以下示例显示 at -l 命令的输出,该输出提供有关用户已提交的所有作业的状态信息。


$ at -l
897543900.a	Sat Jul 14 23:45:00 2004
897355800.a	Thu Jul 12 19:30:00 2004
897732000.a	Tue Jul 17 04:00:00 2004

以下示例显示使用 at -l 命令指定单个作业时所显示的输出。


$ at -l 897732000.a
897732000.a		Tue Jul 17 04:00:00 2004

Procedure如何删除 at 作业

开始之前

成为超级用户或同等角色,以删除属于 root 或其他用户的 at 作业。角色包含授权和具有一定权限的命令。

无需成为超级用户或同等角色,便可删除自己的 at 作业。

  1. 在作业执行之前从队列中删除 at 作业。


    $ at -r [job-id]

    其中,-r job-id 选项指定要删除的作业的标识号。

  2. 使用 at -l(或 atq)命令,验证是否已删除 at 作业。

    at -l 命令显示 at 队列中剩余的作业。不应显示已指定标识号的作业。


    $ at -l [job-id]

示例 8–9 删除 at 作业

在以下示例中,用户要删除计划在 7 月 17 日凌晨 4 点执行的 at 作业。首先,该用户显示 at 队列,以找到作业标识号。然后,用户从 at 队列中删除此作业。最后,该用户验证是否已从队列中删除此作业。


$ at -l
897543900.a	Sat Jul 14 23:45:00 2003
897355800.a	Thu Jul 12 19:30:00 2003
897732000.a	Tue Jul 17 04:00:00 2003
$ at -r 897732000.a
$ at -l 897732000.a
at: 858142000.a: No such file or directory

Procedure如何拒绝对 at 命令的访问

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 编辑 /etc/cron.d/at.deny 文件并添加要禁止其使用 at 命令的用户名,每行一个用户名。


    daemon
    bin
    smtp
    nuucp
    listen
    nobody
    noaccess
    username1
    username2
    username3
    .
    .
    .

示例 8–10 拒绝 at 访问

以下示例显示了一个 at.deny 文件,该文件已被编辑过,因此用户 smithjones 无法访问 at 命令。


$ cat at.deny
daemon
bin
smtp
nuucp
listen
nobody
noaccess
jones
smith

Procedure如何验证 at 命令访问已被拒绝

  1. 要验证是否已将用户名正确添加到 /etc/cron.d/at.deny 文件,请在以该用户身份登录后使用 at -l 命令。如果用户 smith 无法访问 at 命令,将显示以下消息:


    # su smith
    Password:
    $ at -l
    at: you are not authorized to use at.  Sorry.

    类似地,如果该用户尝试提交 at 作业,则将显示以下消息:


    $ at 2:30pm
    at: you are not authorized to use at.  Sorry.

    此消息确认该用户已列在 at.deny 文件中。

    如果允许访问 at 命令,则 at -l 命令不会返回任何内容。