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.txt

3. 时间格式

* * * * * 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.sh

5. 实用技巧

重定向输出

# 丢弃所有输出
* * * * * 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 -l

6. 注意事项

  1. 环境变量:cron 执行环境不同于交互式 shell,建议使用绝对路径
  2. 权限:普通用户只能管理自己的 crontab
  3. 时区:默认使用系统时区,可添加 CRON_TZ=Asia/Shanghai
  4. 文件位置:系统 crontab 在 /etc/crontab,用户级在 /var/spool/cron/crontabs/
  5. 日志:配置不当可能导致日志大量增长,注意设置日志轮转

二、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列出当前等待执行的任务(同 atqat -l
-d删除一个待执行的任务(同 atrmat -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 a

3. batch 命令(系统空闲时执行)

batchat 家族的成员,在系统平均负载低于 1.5 时自动执行,适合消耗资源的非紧急任务。

batch
at> /usr/bin/find / -name "*.log" -size +100M > /tmp/large_logs.txt
at> <EOT>

标签: none

添加新评论