# 定时任务（cron）

URL: https://caijiao.org/rockylinux/cron-job
Source: docs/rockylinux/cron-job.md
Description: 本文详细介绍 Rocky Linux 中使用 cron 定时任务的配置方法，包括 crontab 基础语法、系统任务调度、日志管理与常见问题排查。

在 Linux 系统中，`cron` 是最常用的任务调度工具之一。  
它可以在指定的时间周期自动执行命令或脚本，广泛用于日志清理、备份、监控与自动化运维。

## 一、cron 基本概念

`cron` 由两个主要组件组成：

| 组件        | 作用                                       |
| ----------- | ------------------------------------------ |
| **crond**   | 常驻进程，负责周期性检查任务并执行         |
| **crontab** | 用户任务表文件，定义要执行的命令和时间规则 |

服务启动命令：

```bash
sudo systemctl enable crond
sudo systemctl start crond
```

查看状态：

```bash
systemctl status crond
```

## 二、crontab 的语法格式

每个定时任务的格式如下：

```bash
* * * * *  command
```

对应含义：

| 字段    | 含义           | 取值范围                   |
| ------- | -------------- | -------------------------- |
| 第 1 列 | 分钟（minute） | 0–59                       |
| 第 2 列 | 小时（hour）   | 0–23                       |
| 第 3 列 | 日期（day）    | 1–31                       |
| 第 4 列 | 月份（month）  | 1–12                       |
| 第 5 列 | 星期（week）   | 0–7（0 与 7 都代表星期日） |
| 第 6 列 | 执行命令       | 任意可执行命令             |

## 三、crontab 常用命令

### 1. 编辑当前用户的任务表

```bash
crontab -e
```

### 2. 查看当前用户任务

```bash
crontab -l
```

### 3. 删除当前用户任务

```bash
crontab -r
```

### 4. 查看系统全局任务

```bash
sudo cat /etc/crontab
```

## 四、常见时间表达式示例

| 时间规则       | 含义                 | 示例命令                              |
| -------------- | -------------------- | ------------------------------------- |
| `* * * * *`    | 每分钟执行           | echo "hello"                          |
| `0 * * * *`    | 每小时整点执行       | systemctl restart nginx               |
| `0 2 * * *`    | 每天凌晨 2 点执行    | /backup/backup.sh                     |
| `30 3 * * 1`   | 每周一凌晨 3:30 执行 | rsync -av /data /backup/              |
| `*/10 * * * *` | 每 10 分钟执行一次   | bash /scripts/check.sh                |
| `0 0 1 * *`    | 每月 1 日 0 点执行   | tar -czf /backup/monthly.tar.gz /home |

## 五、系统级与用户级任务

### 1. 用户级任务

每个用户可独立管理自己的任务表：

```bash
crontab -e
```

任务存储路径：

```
/var/spool/cron/<username>
```

### 2. 系统级任务

全局配置文件：

```
/etc/crontab
```

该文件增加了一列“用户”字段：

```bash
* * * * * user command
```

示例：

```bash
0 4 * * * root /usr/local/bin/backup.sh
```

## 六、基于目录的任务（/etc/cron.\*）

Rocky Linux 提供以下目录，用于不同周期任务：

| 目录                 | 执行频率       |
| -------------------- | -------------- |
| `/etc/cron.hourly/`  | 每小时执行一次 |
| `/etc/cron.daily/`   | 每天执行一次   |
| `/etc/cron.weekly/`  | 每周执行一次   |
| `/etc/cron.monthly/` | 每月执行一次   |

只需将可执行脚本放入对应目录即可。

## 七、日志与调试

### 1. 查看 cron 执行日志

```bash
sudo cat /var/log/cron
```

查看最近任务执行记录：

```bash
sudo grep CRON /var/log/cron
```

### 2. 任务输出重定向

在 crontab 中指定日志输出：

```bash
0 2 * * * /backup/backup.sh >> /var/log/backup.log 2>&1
```

### 3. 邮件通知（可选）

系统会将 cron 输出结果发送至本地邮件，可使用 `MAILTO` 指定接收人：

```bash
MAILTO="admin@example.com"
0 3 * * * /scripts/check_disk.sh
```

## 八、常见问题与排查

| 问题         | 可能原因                 | 解决办法                                   |
| ------------ | ------------------------ | ------------------------------------------ |
| 任务未执行   | `crond` 服务未启动       | `sudo systemctl start crond`               |
| 命令路径不对 | 环境变量不同于登录 shell | 使用命令绝对路径（如 `/usr/bin/python3`）  |
| 输出未记录   | 未重定向日志             | 添加 `>> /var/log/task.log 2>&1`           |
| 用户权限不足 | 普通用户任务执行失败     | 检查 `/etc/cron.allow` 与 `/etc/cron.deny` |

## 九、示例：自动备份任务

### 1. 创建脚本 `/scripts/db_backup.sh`

```bash
#!/bin/bash
mysqldump -u root -p123456 mydb > /backup/mydb-$(date +%F).sql
```

添加执行权限：

```bash
chmod +x /scripts/db_backup.sh
```

### 2. 添加定时任务

```bash
crontab -e
```

内容：

```bash
0 2 * * * /scripts/db_backup.sh >> /var/log/db_backup.log 2>&1
```

每天凌晨 2 点自动备份数据库。

## 十、总结

- `cron` 是 Rocky Linux 中最常用的任务调度机制；
- 任务可配置在用户级或系统级；
- 使用日志与 `MAILTO` 便于排错与监控；
- 定时备份、系统清理、服务检测均可通过 cron 自动化实现。

> 💡 提示：对于复杂的任务依赖与失败重试，可使用 `systemd timer` 或 `atd` 进行补充调度。
