crontab与at
Linux 任务调度命令笔记:crontab 与 at
一、crontab 常用命令与用法
crontab 用于管理周期性执行的定时任务。
1. 基本命令
| 命令 | 说明 |
|---|---|
crontab -e | 编辑当前用户的 crontab |
crontab -l | 查看当前用户的 crontab 列表 |
crontab -r | 删除当前用户的 crontab |
crontab -i -r | 删除前确认提示 |
crontab -u username -l | 查看指定用户的 crontab(需 root) |
crontab -u username -e | 编辑指定用户的 crontab(需 root) |
2. 从文件操作
# 从文件安装 crontab
crontab filename
# 备份当前 crontab 到文件
crontab -l > backup.txt
# 从备份文件恢复
crontab backup.txt3. 时间格式
* * * * * command
│ │ │ │ │
│ │ │ │ └─── 星期几 (0-7,0和7都代表周日)
│ │ │ └───── 月份 (1-12)
│ │ └─────── 日期 (1-31)
│ └───────── 小时 (0-23)
└─────────── 分钟 (0-59)特殊符号:
*: 任意值,: 分隔多个值,如1,2,3-: 范围,如1-5/: 间隔,如*/5每5个单位
4. 常用示例
# 每分钟执行
* * * * * /path/to/script.sh
# 每小时的第5分钟执行
5 * * * * /path/to/script.sh
# 每天凌晨2点30分执行
30 2 * * * /path/to/script.sh
# 每周一凌晨3点执行
0 3 * * 1 /path/to/script.sh
# 每月1号凌晨4点执行
0 4 1 * * /path/to/script.sh
# 每15分钟执行
*/15 * * * * /path/to/script.sh
# 每天上午8-11点的第10分钟执行
10 8-11 * * * /path/to/script.sh
# 工作日(周一到周五)每小时执行
0 * * * 1-5 /path/to/script.sh5. 实用技巧
重定向输出
# 丢弃所有输出
* * * * * command > /dev/null 2>&1
# 记录到日志文件
* * * * * command >> /var/log/mylog.log 2>&1设置环境变量
# 在 crontab 文件开头设置
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com
SHELL=/bin/bash
# 或者在命令中指定
* * * * * /usr/local/bin/python3 /path/to/script.py调试和日志
# 查看 cron 日志
tail -f /var/log/cron
grep CRON /var/log/syslog
# 检查用户的 crontab
crontab -l6. 注意事项
- 环境变量:cron 执行环境不同于交互式 shell,建议使用绝对路径
- 权限:普通用户只能管理自己的 crontab
- 时区:默认使用系统时区,可添加
CRON_TZ=Asia/Shanghai - 文件位置:系统 crontab 在
/etc/crontab,用户级在/var/spool/cron/crontabs/ - 日志:配置不当可能导致日志大量增长,注意设置日志轮转
二、crontab 与 at 对比
| 特性对比 | crontab (定时任务) | at (一次性任务) |
|---|---|---|
| 执行频率 | 循环执行,周而复始 | 只执行一次,执行后消失 |
| 适用场景 | 规律、固定周期的自动化任务(如每天备份) | 未来某个时间点只需运行一次的临时任务 |
| 时间设定 | 固定的5个时间字段 (分 时 日 月 周) | 灵活,支持自然语言(如 now + 30 minutes) |
| 任务管理 | crontab -e/-l/-r 管理任务文件 | atq 查看,atrm 删除单个任务 |
| 核心服务/命令 | 依赖 crond 守护进程,命令为 crontab | 依赖 atd 守护进程,命令为 at |
| 文件存储位置 | /var/spool/cron/ 用户特定文件 | /var/spool/at/ 独立文件,执行后自动删除 |
| 权限控制 | /etc/cron.allow 和 /etc/cron.deny | /etc/at.allow 和 /etc/at.deny |
选择建议
- 周期性、规律性任务 → 选择
crontab - 未来单次执行任务 → 选择
at
三、at 命令详细参数
at 用于管理一次性的计划任务。
1. 参数总览
| 参数 | 功能说明 | 使用示例 | |
|---|---|---|---|
-f | 从指定文件中读取要执行的命令 | at -f ./my_script.sh 15:30 | |
-m | 任务完成后,即使无输出也发邮件通知 | `echo "cmd" | at -m now + 1 hour` |
-l | 列出当前等待执行的任务(同 atq) | at -l | |
-d | 删除一个待执行的任务(同 atrm) | at -d 5 | |
-v | 显示任务将被执行的具体时间 | at -v 10:00 | |
-c | 打印指定作业的内容(要执行的命令) | at -c 5 | |
-q | 指定任务的队列(a-z, A-Z) | at -q b now + 5 minutes | |
-t | 使用 [[CC]YY]MMDDhhmm[.SS] 格式指定时间 | at -t 202512312359.59 | |
-V | 显示版本信息 | at -V |
2. 使用示例
从文件读取命令
# 创建任务脚本
echo "date >> /tmp/at_test.log" > mytask.sh
# 安排在 14:30 运行
at -f mytask.sh 14:30强制邮件通知
# 静默任务,但依然发送通知邮件
echo "touch /tmp/silent_file" | at -m now + 2 minutes管理任务
# 安排任务
at 22:00
at> echo "shutdown" > /tmp/task.log
at> <EOT>
# 查看任务列表
at -l # 或 atq
# 删除编号为10的任务
at -d 10 # 或 atrm 10验证时间
at -v now + 2 days
# 输出示例: Thu May 8 12:17:51 2026队列管理
# 低优先级任务到 'z' 队列
at -q z now + 1 hour
# 'B' 队列,系统空闲时执行
at -q B now + 10 minutes
# 查看指定队列的任务
atq -q a3. batch 命令(系统空闲时执行)
batch 是 at 家族的成员,在系统平均负载低于 1.5 时自动执行,适合消耗资源的非紧急任务。
batch
at> /usr/bin/find / -name "*.log" -size +100M > /tmp/large_logs.txt
at> <EOT>