crontab 命令

用途

提交、编辑、列出或除去 cron 作业。

语法

crontab [ -e [ UserName ] | -l [ UserName ] | -r [ UserName ] | -v [ UserName ] | 文件 ]

描述

这个 crontab 命令提交、编辑、列出或除去 cron 作业。 一个 cron 作业是一个命令,其运行是由 cron 守护程序在规则的调度间隔执行的。 要提交一个 cron 作业,指定 crontab 命令用 -e 标志。 crontab 命令调用一个编辑会话,允许创建一个 crontab 文件。 为此文件中的每个 cron 作业创建条目。 每个条目必须是一种 cron 守护程序可接受的格式。 有关创建条目的信息,请参阅 crontab 文件条目格式

当创建完条目和退出文件后,crontab 命令将它复制到 /var/spool/cron/crontabs 目录,并把它放到一个文件中,此文件的名称是当前的用户名。 如果以用户名命名的文件已存在于 crontabs 目录中,crontab 命令会覆盖它。

或者,可以通过指定 File 参数来创建 crontab 文件。 如果此文件已经存在,格式必须是 cron 守护程序所需要的。 如果文件不存在,crontab 命令就调用编辑器。 如果 EDITOR 环境变量存在,此命令就调用它指定的编辑器。 否则, crontab 命令调用 vi 编辑器。

要列出 crontab 文件的内容,就指定 crontab 命令并采用 -l 标志。 要除去存在的文件,采用 -r 标志。

可选的 UserName 参数可被 crontab 文件的所有者或者 root 用户来使用,为指定的用户编辑、列出、除去或验证 cron 作业的状态。 如果 UserName 是无效的,就会产生错误消息并退出程序。

如果可选的 UserName 参数没有被指定,这个 crontab 标志对于 root 用户和当前用户可用。

安全性

只有 root 用户或 crontab 文件的所有者可以在 -e-l-r-v 标志之后使用 UserName 来编辑,列示,除去或验证指定用户的 crontab 文件。

cron 守护程序

这个 cron 守护程序运行的命令和 crontab 文件条目是相对应的。 如果不重新定向 cron 作业的输出为标准输出或标准错误, cron 守护程序就会通过电子邮件告知您任何命令输出或错误。 如果在 crontab 文件中指定了不正确的 cron 作业,这个 cron 守护程序不运行这个作业。

cron 守护程序只在 cron 守护程序被初始化时检查 crontab 文件。 当用 crontab 命令改变 crontab 文件时,指示变化的消息被发送到 cron 守护程序。 这消除了在规则的调度间隔检查新的或改变的文件的开销。

对使用 crontab 命令的控制

/var/adm/cron/cron.allow/var/adm/cron/cron.deny 文件控制哪一个用户可以使用 crontab 命令。 root 用户可以创建、编辑或删除这些文件。 这些文件中的条目是用户登录名,每行一个名称。 如果登录标识和多个的登录名称相关联,这个 crontab 命令采用第一个在 /etc/passwd 文件中的登录名称,而不管当前实际使用哪一个登录名称。 而且,要允许用户启动 cron 作业,应该使用 chuser 命令将 /etc/security/user 文件中的守护程序属性设置为 TRUE。

以下关于 cron.allow 文件的一个示例:

root
nick
dee
sarah

如果 cron.allow 文件存在,只有在文件中出现其登录名称的用户可以使用 crontab 命令。 root 用户的登录名必须出现在 cron.allow 文件中,如果这个文件存在的话。 系统管理员可以明确的停止一个用户,通过使用 crontab 命令,同时在 cron.deny 文件中列出用户的登录名。 如果只有 cron.deny 文件存在,任一名称没有出现在这个文件中的用户可以使用 crontab 命令。

如果以下一个条件成立,用户将不能使用 crontab 命令:

  • cron.allow 文件和 cron.deny 文件不存在 (仅允许 root 用户)。
  • cron.allow 文件存在,但其中未列出用户的登录名。
  • cron.deny 文件存在,其中列出了用户的登录名。

如果 cron.allowcron.deny 文件都不存在,只有被 root 用户授权的人可以用 crontab 命令提交一个作业。

crontab 文件输入格式

一个 crontab 文件包含每个 cron 作业的条目。 条目由换行符分开。 每个 crontab 文件条目包括 6 个字段,它们被空格或制表符以以下格式分开:

 
minute  hour  day_of_month  month  weekday  command

这些字段接收以下值:

描述
0 到 59
hour 0 到 23
月份中的日期 1 到 31
个月 1 到 12
工作日 0 到 6(星期日到星期六)
命令 shell 命令

必须为每个字段指定一个值。 除了 command 字段,这些字段可以包含以下内容:

  • 指定范围内的数字。 要在 5 月运行一个命令,在 month 字段指定 5。
  • 以短划线分隔的两个数字表示包含范围。 要从星期二到星期五运行 cron 作业,把 2-5 放到 weekday 字段中。
  • 以逗号分隔的数字列表。 要在一月第一天和最后一天的运行命令,在 day_of_month 字段中可指定 1,31。
  • 由两个被破折号分开的数字组成的组合表明了包含的范围,可与由逗号格开的数字列表一起使用。 要在一月的第 10 天到第 16 天和最后一天首次运行命令,应该在 day_of_month 字段中指定 1,10-16,31。 以上两点也可用在组合中。
  • * (星号) ,表示所有允许的值。 要每个小时运行一个作业,在小时字段指定一个星号。
注: 任何以反斜杠 (包括%) 开头的字符都会导致按字面值处理该字符。 天的规范是由两个字段(月的天和星期的天)组成的。 如果指定两者都为元素的一个列表,这两个字段均被包含在其中。 例如,如下条目:
0 0 1,15 * 1 command

将在每个月的第一天和第十五天运行 command,还有每个星期一。 要仅在一个字段中指定天,另一字段应包含 *

指定命令

cron 守护程序在所选日期和时间运行第六个字段中指定的命令。 如果在第六个字段中包含% (百分号) ,那么 cron 守护程序会将它之前的所有内容视为命令调用,并使它之后的所有内容都可用于标准输入,除非您对百分号 (\ %) 进行转义。 将忽略空白行以及其第一个非空白字符为数字符号 (#) 的行。 如果命令含有反斜杠 (\) 的参数,反斜杠前应加另一个反斜杠。

注: shell 仅运行命令字段的第一行。 所有其他的行作为标准的输入对于命令可用。

cron 守护程序从 HOME 目录中启动一个子 shell 程序。 如果调度一个命令运行,这时您尚未登录,并且希望在 .profile 文件中的命令运行,这个命令必须明确的读取您的 .profile 文件。

cron 守护程序为每个 shell 提供了一个缺省的环境,定义了 HOME, LOGNAME, SHELL (=/usr/bin/sh ) 和 PATH (=/usr/bin)。

审计事件

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

事件 信息
CRON_JobRemove 列示哪些用户何时除去了 crontab 文件。
CRON_JobAdd 列示哪些用户何时编辑了 crontab 文件。

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

标志

描述
-e UserName 编辑用户的 crontab 文件的副本,或者如果 crontab 文件对于有效的 UserName不存在,那么创建要编辑的空文件。 当编辑完成后,文件被到 crontab 目录作为用户的 crontab 文件。
-l UserName 列出用户的 crontab 文件。
-r UserName crontab 目录除去用户的 crontab 文件。
-v UserName 列出用户 cron 作业的状态。

退出状态

本命令返回以下退出值:

描述
重大安全事件数量 成功完成。
> 0 发生错误。

示例

  1. 要复制调用的文件mycronjobs/var/spool/cron/crontabs 目录中,输入以下内容:
    crontab mycronjobs
    文件将复制为:
    /var/spool/cron/crontabs/<username>
    where <用户名> is your current user name.
  2. 要每小时将时间写入控制台(以小时的形式),请输入:
    0 * * * * echo The hour is `date` . 
    >/dev/console
  3. 在 6:30 a.m运行 calendar 命令。 每个星期一,星期三和星期五,输入:
    30 6 * * 1,3,5 /usr/bin/calendar
  4. 要在一年中每天 6:30 运行 calendar 命令,请输入:
    30 6 * * * /usr/bin/calendar
  5. 要运行调用的脚本maintenance每天在 8 月的午夜,输入以下内容:
    0 0 * 8 * /u/harry/bin/maintenance
  6. 为命令的标准输入定义文本,请输入:
    0 16 * 12 5 /usr/sbin/wall%HAPPY HOLIDAY!%Remember to 
    turn in your time card.
    %(百分号)之后定义 wall 命令的标准输入的文本:
    HAPPY HOLIDAY!
     
    Remember to turn in your time card.

文件

描述
/var/adm/cron/FIFO 命名管道,使用 crontabat 命令提交新作业时,它会将消息发送到 cron 守护程序。
/var/spool/cron/crontabs 指定 crontab 缓冲池区域。
/var/adm/cron/cron.allow 指定用户列表,这些用户被允许访问 crontab 命令。
/var/adm/cron/cron.deny 指定用户列表,这些用户不被允许访问 crontab 命令。