{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2026-03-27 14:55:27","updateBy":"admin","updateTime":"2026-03-27 14:55:27","remark":null,"id":127,"articleTitle":"Linux：定时任务","articleUrl":"linux_cron","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/ee03af4419724d50a127c34d6a588554.png","articleFlag":"0","draftStatus":"1","reprintStatement":"0","articleSummary":"crontab是 Linux 系统中用于管理周期性任务的工具，它基于 cron 守护进程运行，能够按照设定的时间自动执行命令或脚本。","articleContent":"`crontab` 是 Linux 系统中用于管理**周期性任务**的工具，它基于 cron 守护进程运行，能够按照设定的时间自动执行命令或脚本。\n\n### 1. 基本概念\n\n- **cron**：系统后台守护进程，负责在指定时间执行任务。\n- **crontab**：每个用户的定时任务列表，存储在 `/var/spool/cron/` 下。\n- 系统级 crontab：`/etc/crontab` 和 `/etc/cron.d/` 目录，用于系统维护任务。\n\n### 2. crontab 命令\n\n| 命令                | 说明                                         |\n| ------------------- | -------------------------------------------- |\n| `crontab -e`        | 编辑当前用户的 crontab 文件                  |\n| `crontab -l`        | 列出当前用户的 crontab 内容                  |\n| `crontab -r`        | 删除当前用户的 crontab                       |\n| `crontab -u 用户名` | 操作指定用户的 crontab（通常需要 root 权限） |\n\n### 3. 任务格式\n\n每行代表一个定时任务，格式如下：\n\n```bash\n* * * * * command_to_execute\n│ │ │ │ │\n│ │ │ │ └─── 星期几 (0 - 7, 0和7都表示周日)\n│ │ │ └───── 月份 (1 - 12)\n│ │ └─────── 日期 (1 - 31)\n│ └───────── 小时 (0 - 23)\n└─────────── 分钟 (0 - 59)\n```\n\n**特殊字符**：\n\n- `*` ：任意值\n- `,` ：枚举，如 `1,15,30`\n- `-` ：范围，如 `1-5`\n- `/` ：步长，如 `*/10` 表示每10个单位\n\n**预定义字符串**（某些系统支持）：\n\n- `@reboot` ：系统启动时执行一次\n- `@daily` ：每天 0:00\n- `@hourly` ：每小时整点\n\n### 4. 实用示例\n\n| 目标                | 表达式                            |\n| ------------------- | --------------------------------- |\n| 每天 2:30 执行备份  | `30 2 * * * /home/user/backup.sh` |\n| 每周一 8:00 执行    | `0 8 * * 1 /path/to/script`       |\n| 每 10 分钟执行      | `*/10 * * * * /path/to/script`    |\n| 每月 1 日 0:00 执行 | `0 0 1 * * /path/to/script`       |\n| 工作日 9:00 执行    | `0 9 * * 1-5 /path/to/script`     |\n\n### 5. 环境变量\n\ncron 执行时的环境与登录 shell 完全不同，默认只有极简的 `PATH`（通常为 `/usr/bin:/bin`）和基本的 `HOME`、`LOGNAME`。因此，某些命令可以在shell环境中执行，但是在crontab中执行时就会出现 `command not found`的报错，为此则需要：\n\n- **设置 PATH**：在 crontab 文件顶部添加 `PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin`\n- **脚本内配置**：或在脚本开头 `export PATH=...` 并设置必要的环境变量\n- **绝对路径**：在crontab中使用绝对路径调用命令，`/usr/local/bin/java -jar ......`\n\n**查看实际环境**：添加临时任务 `* * * * * env > /tmp/cron_env.txt`，一分钟后查看文件内容。\n\n```bash\nXDG_SESSION_ID=3954\nSHELL=/bin/sh\nUSER=root\nPATH=/usr/bin:/bin\nPWD=/root\nLANG=en_US.UTF-8\nSHLVL=1\nHOME=/root\nLOGNAME=root\nXDG_RUNTIME_DIR=/run/user/0\n_=/usr/bin/env\n```\n\n### 6. 输出与日志\n\ncron 任务的输出（标准输出和标准错误）默认会通过邮件发送给用户`/var/spool/mail/username`（如果邮件服务配置正常）。为便于排查，**强烈建议重定向输出**：\n\n```bash\n30 4 * * * /home/user/backup.sh >> /home/user/backup.log 2>&1\n```\n\n此外，cron 自身的执行记录可查看系统日志：\n\n```bash\ngrep CRON /var/log/syslog   # Debian/Ubuntu\ngrep CRON /var/log/cron     # RHEL/CentOS\n```\n\n### 7. 系统级与用户级 crontab\n\n- **用户 crontab**：`crontab -e` 编辑，格式为 `分 时 日 月 周 命令`\n- **系统 crontab**：`/etc/crontab` 和 `/etc/cron.d/*` 文件，额外多了一个“用户”字段，格式为 `分 时 日 月 周 用户名 命令`\n\n例如 `/etc/crontab` 中的一行：\n\n```bash\n30 2 * * * root /usr/local/bin/backup.sh\n```\n\n系统 crontab 更适合需要以特定用户身份执行的任务。\n\n### 8. 管理 cron 服务\n\n- 检查服务状态：`systemctl status cron` 或 `service cron status`\n- 启动/停止：`systemctl start/stop cron`\n- 查看日志：`journalctl -u cron`（systemd 系统）\n\n","categoryId":1,"viewCount":34,"categoryName":"Linux","author":"球接子","authorAvatar":null,"tagIds":[10],"tagNames":["Linux基础"]}}