at 命令 #
at
命令用于在指定的时间执行一次性任务。它允许用户安排命令或脚本在未来的某个时间点运行,而不像cron
那样定期重复执行。
语法 #
at [选项] 时间
at [选项] -f 文件 时间
常用选项 #
选项 | 描述 |
---|---|
-f 文件 |
从指定文件读取命令,而不是标准输入 |
-m |
即使没有输出,也发送邮件给用户 |
-v |
显示任务将被执行的时间 |
-q 队列 |
使用指定的队列。队列名是单个字母,范围从a到z和A到Z。默认队列是a |
-l |
列出待处理的作业(等同于atq 命令) |
-d 作业号 |
删除指定的作业(等同于atrm 命令) |
-c 作业号 |
显示指定作业的命令 |
时间格式 #
at
命令支持多种时间格式:
绝对时间 #
HH:MM
:当天的指定小时和分钟(例如:14:30)HH:MM YYYY-MM-DD
:指定日期的指定时间(例如:14:30 2023-12-31)YYYY-MM-DD
:指定日期的午夜(例如:2023-12-31)
相对时间 #
now + N minutes/hours/days/weeks/months/years
:从现在起N分钟/小时/天/周/月/年后noon/midnight/teatime
:当天的中午12点/午夜0点/下午4点
特殊关键字 #
now
:立即(通常与相对时间一起使用)noon
:当天的中午12点midnight
:下一个午夜0点teatime
:下午4点
常见用法 #
1. 在特定时间执行命令 #
at 14:30
输入命令后,按Ctrl+D
结束输入。
2. 在相对时间后执行命令 #
at now + 30 minutes
3. 在特定日期执行命令 #
at 10:00 2023-12-31
4. 从文件读取命令 #
at -f commands.txt 22:00
5. 列出待处理的作业 #
at -l
或者使用等效命令:
atq
6. 删除作业 #
at -d 作业号
或者使用等效命令:
atrm 作业号
7. 查看作业内容 #
at -c 作业号
实用示例 #
1. 安排系统关机 #
at 23:00
shutdown -h now
[Ctrl+D]
2. 在指定时间运行脚本 #
at midnight
/path/to/backup_script.sh
[Ctrl+D]
3. 在30分钟后发送提醒 #
at now + 30 minutes
echo "会议提醒!" | mail -s "重要会议" [email protected]
[Ctrl+D]
4. 在下周一早上执行命令 #
at 9:00 monday
/path/to/weekly_report.sh
[Ctrl+D]
5. 在特定日期备份数据库 #
at 02:00 2023-12-31
pg_dump database > /backup/database_$(date +\%Y\%m\%d).sql
[Ctrl+D]
6. 使用重定向输入命令 #
echo "/path/to/script.sh" | at 15:00
7. 使用不同的队列 #
at -q b now + 1 hour
echo "使用b队列的任务"
[Ctrl+D]
8. 在指定时间发送文件 #
at teatime
tar -czf /tmp/archive.tar.gz /important/files && scp /tmp/archive.tar.gz user@remote:/backup/ && rm /tmp/archive.tar.gz
[Ctrl+D]
访问控制 #
at
命令的访问控制由两个文件管理:
/etc/at.allow
:如果此文件存在,只有列在此文件中的用户可以使用at
命令/etc/at.deny
:如果此文件存在(且at.allow
不存在),除了列在此文件中的用户外,所有用户都可以使用at
命令
如果两个文件都不存在,根据系统配置,可能只有超级用户可以使用at
命令。
环境变量 #
at
命令会保留大多数当前环境变量,包括:
- 当前工作目录
- 环境变量(如PATH、HOME等)
- umask值
这意味着在at
作业中执行的命令将在与提交作业时相同的环境中运行。
输出处理 #
默认情况下,at
作业的输出会通过邮件发送给执行该作业的用户。如果不希望接收邮件,可以将输出重定向:
at 15:00
command > output.log 2>&1
[Ctrl+D]
与其他调度工具的比较 #
工具 | 用途 | 适用场景 |
---|---|---|
at | 一次性任务调度 | 需要在特定时间执行一次的任务 |
cron | 定期重复任务 | 需要按计划定期执行的任务 |
batch | 系统负载允许时执行任务 | 需要在系统资源充足时执行的任务 |
anacron | 确保任务在系统启动后执行 | 适用于不是24/7运行的系统 |
相关命令 #
atq
:列出待处理的at作业(等同于at -l
)atrm
:删除at作业(等同于at -d
)batch
:当系统负载允许时执行命令(使用at的变体)
常见问题排查 #
1. 作业未执行 #
可能的原因:
- at服务未运行(检查:
systemctl status atd
) - 用户在
/etc/at.deny
中或不在/etc/at.allow
中 - 命令路径问题(使用绝对路径)
- 环境变量问题
2. 无法查看或删除作业 #
可能的原因:
- 权限不足(只有root用户和作业所有者可以查看或删除作业)
- 作业已执行或被删除
3. 没有收到邮件通知 #
可能的原因:
- 邮件系统未配置
- 输出被重定向
- 命令没有产生输出
提示 #
- 使用绝对路径指定命令和脚本,避免路径问题
- 考虑将输出重定向到文件,便于后续检查
- 对于复杂的任务,最好创建脚本文件,然后使用
at -f
执行 - 使用
atq
定期检查待处理的作业 - 如果系统不是24/7运行,考虑使用
anacron
而不是at
- 对于需要在低负载时执行的任务,使用
batch
命令 - 在
at
命令中使用日期命令时,记得转义百分号(\%
) - 如果需要在
at
作业中使用图形界面程序,确保设置了DISPLAY
环境变量