Cron

cron 命令行实用程序是类 Unix 操作系统上的作业调度程序。设置和维护软件环境的用户使用 cron 来调度作业[1](命令或 shell 脚本),也称为 cron 作业,[2][3] 以固定的时间、日期或间隔定期运行。[4] 它通常自动化系统维护或管理——尽管它的通用性质使其可用于从 Internet 下载文件和定期下载电子邮件等操作。[5]

Cron 最适合调度重复性任务。可以使用关联的 at 实用程序完成计划一次性任务。

克朗的名字起源于chronos,希腊语中时间的意思。[6][需要更好的来源]

概述[编辑]

cron 的操作由 crontab(cron 表)文件驱动,该文件指定按给定计划定期运行的 shell 命令。crontab 文件存储在保存作业列表和 cron 守护程序的其他指令的位置。用户可以拥有自己的个人crontab文件,并且通常有一个系统范围的crontab文件(通常在例如的子目录中),只有系统管理员可以编辑。/etc/etc/etc/cron.d

crontab 文件的每一行代表一个作业,如下所示:

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

每行的语法都需要一个由五个字段组成的 cron 表达式,这些字段表示执行命令的时间,后跟要执行的 shell 命令。

虽然通常当时间/日期规范字段都与当前时间和日期匹配时执行作业,但有一个例外:如果“月份中的某天”(字段 3)和“星期几”(字段 5)都受到限制(不包含“*”),则一个或两个必须与当前日期匹配。[注7]

例如,假设 cron 用户的默认 shell 符合 Bourne shell,则在每天午夜 (00:01) 过后一分钟清除 Apache 错误日志:

1 0 * * * printf "" > /var/log/apache/error_log

此示例在每个星期六的 23:45(晚上 11:45)运行名为 export_dump.sh 的 shell 程序。

45 23 * * 6 /home/oracle/scripts/export_dump.sh

注意:在某些系统上,还可以指定每隔 n 个时间间隔运行一次。此外,可以使用逗号指定多个特定时间间隔(例如,)。下面的将每隔 5 分钟向命令行输出“hello world”,每个第一个、第二个和第三个小时(即,01:00、01:05、01:10,直到 03:55)。*/n1,2,3

*/5 1,2,3 * * * echo hello world

无论实际实现将此文件存储在何处,都可以通过调用来编辑用户的配置文件。crontab -e

一些实现,例如由Paul Vixie编写并包含在许多Linux发行版中的流行的第4个BSD版本,添加了第六个字段:运行指定作业的帐户用户名(取决于用户是否存在和权限)。这仅在系统 crontab 中是允许的,在其他 crontab 中不允许,每个 crontab 都分配给单个用户进行配置。第六个字段有时用于年份而不是帐户用户名 - 适用于 Windows 的 nncron 守护程序执行此操作。cron

cron 的 Amazon EventBridge 实现不使用基于 0 的星期几,而是使用 1-7 SUN-SAT(而不是 0-6),并支持其他表达式功能,例如第一个工作日和每月的最后一天。[8]

非标准预定义调度定义[编辑]

一些 cron 实现[9] 支持以下非标准宏:

进入 描述 相当于
@yearly(或@annually) 每年1月<>日午夜运行一次 0 0 1 1 *
@monthly 每月在每月第一天的午夜运行一次 0 0 1 * *
@weekly 每周一次,周日上午午夜运行 0 0 * * 0
@daily(或@midnight) 每天午夜运行一次 0 0 * * *
@hourly 每小时运行一次 0 * * * *
@reboot 启动时运行

@reboot将作业配置为在守护程序启动时运行一次。由于 cron 通常永远不会重新启动,因此这通常对应于正在引导的计算机。这种行为在某些 cron 变体中是强制执行的,例如 Debian 中提供的变体,[10] 因此简单地重新启动守护进程不会重新运行作业。@reboot

@reboot如果需要在特定用户下启动服务器或守护程序,并且用户无权配置 init 以启动程序,则可能很有用。

Cron 权限[编辑]

这两个文件起着重要作用:

  • /etc/cron.allow - 如果此文件存在,它必须包含该用户的名称才能允许使用 cron 作业。
  • /etc/cron.deny - 如果 cron.allow 文件不存在,但 /etc/cron.deny 文件确实存在,那么要使用 cron 作业,用户不得列在 /etc/cron.deny 文件中。

请注意,如果这些文件都不存在,则根据与站点相关的配置参数,要么只有超级用户可以使用 cron 作业,要么所有用户都可以使用 cron 作业。

时区处理[编辑]

大多数 cron 实现只是解释运行 cron 守护程序的系统时区设置中的 crontab 条目。如果大型多用户计算机的用户位于多个时区,这可能会引起争议,尤其是在系统默认时区包含可能令人困惑的 DST 时。因此,cron 实现可以作为特殊情况识别用户 crontab 中“CRON_TZ=<时区>”形式的行,解释相对于该时区的后续 crontab 条目。[注11]

posted @ 2023-06-06 16:26  Python喵  阅读(45)  评论(0编辑  收藏  举报