文章目录
- 一、`at`:一次性任务调度
- 1. **基本用法**
- 2. **管理任务**
- 3. **权限控制**
- 二、`cron`:周期性任务调度
- 1. **用户级任务**
- 2. **系统级任务**
- 3. **特殊字符串**
- 4. **权限控制**
- 5. **环境问题**
- 三、容器环境中的例行任务
- 1. **在容器内运行 `cron`**
- 2. **外部调度**
- 3. **避免常见问题**
- 四、总结
在Linux系统中,例行任务管理主要依赖 at
和 cron
两个工具,同时系统提供了灵活的配置方式(如 /etc/crontab
或 /etc/cron.d/
目录)。若涉及容器环境,还需考虑容器化场景的特殊性。以下是深度解析:
一、at
:一次性任务调度
1. 基本用法
- 语法:
at [时间]
,输入命令后按Ctrl+D
保存。 - 时间格式:
- 绝对时间:
10:00 AM
、2024-12-31
。 - 相对时间:
now + 5 minutes
、tomorrow
。 - 关键词:
noon
(中午12点)、teatime
(下午4点)。
- 绝对时间:
- 示例:
echo "shutdown -h now" | at 23:59
2. 管理任务
atq
:查看待执行的任务队列。atrm <任务号>
:删除指定任务。
3. 权限控制
- 通过
/etc/at.allow
和/etc/at.deny
限制用户:- 若
at.allow
存在,仅列出的用户可使用at
。 - 若两文件均不存在,仅 root 可用。
- 若
二、cron
:周期性任务调度
1. 用户级任务
- 编辑任务:
crontab -e
- 时间格式:
* * * * * <命令> │ │ │ │ │ │ │ │ │ └─ 星期 (0-7, 0和7均为周日) │ │ │ └─── 月份 (1-12) │ │ └───── 日 (1-31) │ └─────── 小时 (0-23) └───────── 分钟 (0-59)
- 示例:
0 3 * * * /backup.sh # 每天3点执行 */10 * * * * ping example.com # 每10分钟执行
2. 系统级任务
- 配置文件:
/etc/crontab
:需指定用户字段(如root
)。/etc/cron.d/
:存放独立配置文件。/etc/cron.hourly/
,cron.daily/
等目录:按周期执行脚本。
- 示例(
/etc/crontab
):0 5 * * * root /usr/bin/apt update
3. 特殊字符串
@reboot
:系统启动时执行。@daily
、@weekly
、@monthly
:简化周期设置。
4. 权限控制
- 通过
/etc/cron.allow
和/etc/cron.deny
管理用户权限,规则同at
。
5. 环境问题
- 环境变量:cron 任务默认环境简单,建议:
- 使用绝对路径。
- 在脚本中手动设置环境变量(如
PATH
)。
- 日志:查看
/var/log/syslog
或journalctl -u cron
。
三、容器环境中的例行任务
若用户实际指 容器(Container) 中的任务调度(可能误写为 /etc/contain
),需注意以下事项:
1. 在容器内运行 cron
- 启动 cron 服务:需在容器启动时运行
cron
(如 Dockerfile 中):RUN apt-get install -y cron CMD ["cron", "-f"] # 前台运行
- 日志处理:容器默认无 syslog,建议将输出重定向:
* * * * * root /script.sh > /proc/1/fd/1 2>&1 # 输出到容器日志
2. 外部调度
- 使用宿主机 cron 或工具(如
docker exec
)触发容器内任务:0 * * * * docker exec my_container /script.sh
3. 避免常见问题
- 时区设置:确保容器时区与宿主一致(通过挂载
/etc/localtime
)。 - 资源限制:避免 cron 任务耗尽容器资源。
四、总结
工具 | 用途 | 配置位置 | 适用场景 |
---|---|---|---|
at | 一次性任务 | /var/spool/at/ | 临时任务 |
cron | 周期性任务 | crontab -e 、/etc/cron* | 日常维护 |
容器 cron | 容器内周期任务 | 容器内 /etc/cron.d/ | 微服务、云原生 |
关键建议:
- 任务命令使用绝对路径。
- 日志记录和错误处理(如重定向
2>&1
)。 - 容器中优先考虑轻量级调度(如
busybox crond
)。