定时任务 cron

任务调度是指在预定时间或周期性自动执行特定脚本或系统维护命令的技术。这在日常系统维护(如自动备份、更新日志、执行周期巡检)中极为常见。

Linux 系统中最主流的任务调度工具是 cron。它通过读取 crontab 配置文件来驱动定时任务的执行。

Crontab 时间格式定义

cron 守护进程启动后,会周期性读取被称为 crontab 的定时任务配置文件。要配置一个周期执行的任务,你需要提供六个字段,前五个字段定义了执行的时间周期,第六个字段则是要执行的具体命令。

在配置文件的单行行头,这五个时间字段的具体含义和范围如下:

  1. 分(MIN,0 - 59):任务在具体哪一分钟开始执行。
  2. 时(HOUR,0 - 23):任务在具体哪一个小时开始执行。
  3. 日(DOM,1 - 31):Month 中的某一天(Day of Month)。
  4. 月(MON,1 - 12):具体哪个月份。
  5. 周(DOW,0 - 7):Week 中的某一天(Day of Week),其中 0 和 7 都代表星期日。

在设置时间时,经常会使用通配符或特殊操作符:

  • 星号 *:代表“任意”或“每一次”。如果在 DOM 字段写 *,代表每天都会执行。
  • 除号 /:代表“每隔”。例如在 MIN 字段配置 */15,代表每隔 15 分钟执行一次该命令。

时间配置示例

  • 0 0 1 * * /path/to/script.sh:代表每月 1 号的凌晨 0 点 0 分执行一次脚本。
  • 0 0 * * 0 /path/to/script.sh:代表每周日(DOW 字段为 0)的凌晨 0 点 0 分执行一次清理脚本。
  • */5 * * * * /path/to/script.sh:代表每隔 5 分钟执行一次该脚本。

Crontab 系统定时任务行的各时间字段与执行用户分解示意图

注意

系统级与用户级 Crontab 的区别: 在通过 crontab -e 修改的个人用户任务列表中,配置格式是 5 个时间字段紧跟具体命令;而如果是修改存放于 /etc/cron.d/ 等目录下的系统级配置文件,在 5 个时间字段之后、具体命令之前,必须多写一个“以什么用户身份运行”的字段(如 root),否则系统无法识别。

编辑与管理定时任务

你可以使用 crontab 命令来管理你当前用户的定时任务列表:

  • 编辑任务:输入以下命令可以调用终端编辑器直接编辑你的定时配置文件。
    crow@opsbox:~$ crontab -e
    
  • 列出任务:查看当前用户已配置的定时任务列表。
    crow@opsbox:~$ crontab -l
    

提示

现代化替代方案:Systemd Timers 虽然 cron 简单且无处不在,但现代 Linux 还提供了 systemd 计时器。它通常由一个 .timer 文件定义触发规则,并关联一个 .service 文件定义要运行的命令。它可以记录运行结果、设置错过触发后的补跑策略;CPU 和内存限制则配置在对应的 service 单元中。

crontab 时间字段分析

练习

在 crontab 定时配置中,第一字段代表分钟。如果第一字段写为 */15,而其余四个时间字段均为通配符 *,代表该定时任务每隔多少分钟会被执行一次?请提交对应的阿拉伯数字(例如 5)。

提交答案

题解 Hint

练习三:分析定时任务获取巡检报告

在此实操练习中,我们将通过对系统定时配置文件的审计,锁定并读取一个周期性生成的维护报告。

首先,在网页终端中继续以 crow 用户的身份进行操作。

  1. 按照 Linux 规范,系统级的定时任务配置会存放于 /etc/cron.d/ 目录下。我们先列出该目录下的文件:
    crow@opsbox:~$ ls -l /etc/cron.d/
    -rw-r--r-- 1 root root 51 Jul 15 22:00 opsbox-maint
    
    输出中会显示一个名为 opsbox-maint 的文件。
  2. 我们读取该文件的具体内容:
    crow@opsbox:~$ cat /etc/cron.d/opsbox-maint
    */5 * * * * root /usr/local/bin/rotate-report.sh
    
    这代表系统每隔 5 分钟,会以最高特权用户 root 的身份,自动运行 /usr/local/bin/rotate-report.sh 脚本。
  3. 既然我们没有直接权限查看 root 的运行状态,但我们可以通过审计该脚本来确定它的工作流。读取该脚本的内容:
    crow@opsbox:~$ cat /usr/local/bin/rotate-report.sh
    #!/bin/bash
    # ...
    /usr/local/bin/generate-report.sh > /var/spool/opsbox/current-report.log
    
    审计脚本代码后,你会发现最后一行有一句重定向输出指令,将统计好的系统报告输出写入了一个特定的日志路径。
  4. 我们直接读取该日志报告文件:
    crow@opsbox:~$ cat /var/spool/opsbox/current-report.log
    -- System Report --
    Date: 2026-07-16
    Status: OK
    verify: COIN{……}
    
    在报告文本的末尾注释或回显行中,你会找到包含验证令牌的那一行。
  5. 记录并提交该令牌以完成此挑战。

顺着定时任务找到巡检报告

Lab

opsbox 上有个 cron 定时任务在周期性生成一份巡检报告。找到这个任务,顺着它调用的脚本看报告写到了哪,读出报告里的 verify 校验码。

在网页终端(TARGET 终端(启动 Lab 后显示))里操作并提交校验码。

提交格式:COIN{........}

加载会话状态…

提交 coin

题解 Hint