at 命令是 Linux 系统中用于在指定时间点执行一次性任务的经典工具。与周期性任务调度器 cron 不同,at 任务执行一次后便会自动从队列中移除,适用于临时的、单次的自动化操作。

核心机制

at 命令的运行依赖于后台守护进程 atd。其工作流程如下:

用户通过 at 命令提交一个包含指令或脚本的任务及其执行时间。

atd 进程在后台运行,默认每 60 秒检查一次作业队列。

当系统时间与任务设定的时间匹配时,atd 会调用相应的 shell 来执行该任务。

使用前请务必确保 atd 服务已启动,可使用以下命令检查:

systemctl status atd      # 查看服务状态
# 或
ps -ef | grep atd         # 检查进程是否存在

命令格式与常用选项

基本命令格式:

at [选项] [时间]

任务内容可以在输入命令后,在随后的交互式提示中逐行输入,最后按 Ctrl + D 结束并提交。

常用选项速查表:

选项 功能描述 等效命令
-m 任务完成后,无论是否有输出,都向用户发送邮件通知。
-l 列出当前用户所有待执行的 at任务。 atq
-d <编号> 删除指定编号的 at任务。 atrm <编号>
-c <编号> 查看(cat)指定编号任务的具体命令内容。
-f <文件> 从指定的脚本文件中读取任务命令,而非标准输入。
-t <时间> 使用 [[CC]YY]MMDDhhmm[.ss]格式直接指定时间。
-v 显示任务的详细计划执行时间。

时间参数的指定方法

at 的强大之处在于其高度灵活的时间设定方式。

类别 格式示例 说明
标准时间 08:30 当天 8:30。若已过时,则顺延至次日。
模糊时间 midnight, noon, teatime 分别代表午夜 (00:00)、中午 (12:00)、下午茶 (通常 16:00)。
12小时制 11:00 PM, 9:30am 需明确标注 AM/PM 或 am/pm。
具体日期 11:00 2025-12-25 11:00 12/25/2025 在时间后加上日期。支持 YYYY-MM-DDMM/DD/YY等格式。
相对计时 now + 2 hours now + 30 minutes now + 1 week 从当前时间算起。单位可为 minuteshoursdaysweeks
自然日期 tomorrow 17:00 next Monday 使用自然语言指定。

实战应用案例

1、5 天后下午 5 点,列出 /home 目录内容

at 5pm +5 days
# 进入交互输入模式
/bin/ls -la /home
# 按 Ctrl + D 提交

2、查看当前排队中的任务

atq
# 或
at -l

输出示例:

7 Sat Mar 15 17:00:00 2025 a username

3、明天下午 5 点,将当前时间写入日志文件

at 5pm tomorrow
date >> /root/date.log
# 按 Ctrl + D 提交

4、通过脚本文件提交复杂任务

首先创建脚本 myscript.sh,然后:

at -f /path/to/myscript.sh 09:00 next Monday

5、删除已计划的任务

假设通过 atq 查得任务编号为 7:

atrm 7
# 或
at -d 7

重要注意事项与技巧

  • 权限管理:系统管理员可以通过 /etc/at.allow/etc/at.deny 文件来控制允许或禁止使用 at 命令的用户。
  • 环境变量at 任务在执行时会继承当前用户的环境变量,包括当前的工作目录 (PWD)。
  • 输出处理:任务的标准输出和错误默认会通过邮件发送给提交者。如果希望静默执行,可以在命令末尾重定向输出,例如:command > /dev/null 2>&1
  • atcron 的选择: 用 at一次性的、临时的任务(如“2 小时后重启服务”、“明天早上下载文件”)。 用 cron周期性的、固定频率的任务(如“每天凌晨备份”、“每周一清理日志”)。

总结

at 命令是 Linux 系统管理工具箱中一个轻巧而强大的“定时单次执行”工具。掌握其灵活的时间设定语法和任务管理选项(atq, atrm),可以高效地自动化处理各种临时性后台作业。