执行命令 at 是 Linux 和 Unix 系统中一个非常实用的定时任务工具,它允许用户在指定的时间点执行一次性的命令或脚本,与 cron 不同,cron 用于设置周期性重复的任务,而 at 则专注于单次执行的任务,适用于临时性的、未来某个特定时间需要完成的操作,下面将详细介绍 at 命令的使用方法、核心功能、常见场景以及注意事项。

at 命令的基本语法和工作原理
at 命令的基本语法结构为 at [选项] 时间,其中时间参数可以有多种格式,例如绝对时间(如 14:30、2023-12-31 23:59)、相对时间(如 now + 1 hour、tomorrow + 3 days)或特定日期描述(如 midnight、noon),执行 at 命令后,系统会进入一个交互式输入模式,用户可以在其中输入需要执行的命令或脚本内容,输入完成后按 Ctrl+D 结束输入,at 命令会将任务提交到系统的 at 队列中,并由 atd 守护进程在指定时间自动执行。
at 命令的常用选项包括:
-m:任务执行后向用户发送邮件通知,即使标准输出和标准错误都为空。-l或atq:列出当前 at 队列中的所有任务,显示任务编号、执行时间和用户。-d [任务编号]或atrm [任务编号]:删除指定的 at 任务。-f [文件名]:从指定文件中读取要执行的命令,而不是通过交互式输入。-V:显示 at 命令的版本信息。-c [任务编号]:显示指定任务的详细内容,包括输入的命令和执行环境。
at 命令的时间格式详解
at 命令对时间格式的支持非常灵活,用户可以根据需求选择最直观的表达方式,以下是常见的时间格式示例:
- 绝对时间:直接指定具体的日期和时间,格式为
HH:MM YYYY-MM-DD或HH:MM MM/DD/YY。at 15:30 2023-10-01表示在 2023 年 10 月 1 日下午 3:30 执行任务。 - 相对时间:使用
now + 时间间隔的格式,时间间隔可以是分钟(minutes)、小时(hours)、天(days)等。at now + 30 minutes表示 30 分钟后执行,at tomorrow + 2 days表示两天后的此时执行。 - 特定时间点:使用系统预设的时间关键词,如
midnight(午夜)、noon(中午)、teatime(下午 4 点)等。at teatime表示当天的下午 4 点执行。 - 日期描述:结合星期或月份名称,如
at 9:00 next Monday或at 23:00 Dec 25。
需要注意的是,at 命令的时间解析依赖于系统的本地化设置,建议使用标准格式以避免歧义,atd 守护进程需要处于运行状态,否则任务将无法被调度,在大多数 Linux 发行版中,可以通过 systemctl status atd 检查其状态,并通过 systemctl start atd 启动服务。

at 命令的交互式与文件输入模式
at 命令支持两种输入任务内容的方式:交互式输入和文件输入,交互式模式适合执行简单的命令或测试,用户直接在终端输入命令即可。
at 10:00 tomorrow > echo "This is a test task" >> /tmp/test.log > ls -l /home > Ctrl+D
上述命令会在明天上午 10 点执行两条命令,并将结果追加到 /tmp/test.log 文件中,同时列出 /home 目录的详细信息。
对于复杂的脚本或需要多行命令的场景,使用 -f 选项从文件读取更为方便,假设有一个脚本文件 backup.sh如下:
#!/bin/bash tar -czf /tmp/backup_$(date +%Y%m%d).tar.gz /home/user/documents
可以通过以下命令提交任务:

at -f backup.sh 23:00 tonight
这种方式可以避免交互式输入时的错误,并且便于脚本的管理和复用。
at 队列的管理与任务监控
at 命令提供了简单的队列管理功能,用户可以查看或删除已提交的任务,使用 atq 命令可以列出当前 at 队列中的所有任务,输出格式通常包括任务编号、执行时间、队列名称和用户。
12345 2023-10-01 15:30 a user1
12346 2023-10-01 18:00 b user2
a 和 b 是队列名称,默认情况下任务会被放入 a 队列,但可以通过 at -q [队列名] 指定队列,队列的优先级可以通过名称排序,a 是最高优先级,z 是最低。
如果需要删除某个任务,可以使用 atrm 命令并指定任务编号。atrm 12345 会删除编号为 12345 的任务,需要注意的是,只有任务的所有者或 root 用户才能删除任务。
at 命令的执行环境与注意事项
at 命令执行任务时的环境与用户提交任务时的环境存在一些差异,这是需要注意的关键点:
- 环境变量:at 任务会继承提交任务时的基本环境变量,但不会继承当前终端的会话环境(如临时设置的别名或函数),建议在脚本中使用绝对路径,避免依赖当前目录。
- 标准输入/输出/错误:at 任务的标准输出和标准错误默认会通过邮件发送给用户,前提是系统配置了邮件服务(如 postfix 或 sendmail),使用
-m选项可以确保即使没有输出也发送邮件。 - 权限问题:at 任务以提交用户的身份执行,因此需要确保命令或脚本具有相应的执行权限,如果涉及系统关键操作,建议使用 root 用户提交任务。
- 系统负载:at 任务在指定时间执行时,如果系统负载过高,可能会导致任务延迟,对于高优先级任务,建议结合
nice命令调整优先级。
at 命令的典型应用场景
at 命令在以下场景中具有独特的优势:
- 临时备份任务:例如在非工作时间执行数据库备份,避免影响业务。
- 系统维护窗口:如凌晨重启服务或清理日志文件。
- 延迟处理任务:例如在用户提交请求后 30 分钟发送通知邮件。
- 测试与调试:在特定时间触发某个操作,用于验证系统行为。
相关问答 FAQs
问题 1:at 命令和 cron 命令有什么区别?
解答:at 命令用于执行一次性的定时任务,而 cron 命令用于执行周期性重复的任务,at 任务在指定时间执行一次后自动消失,而 cron 任务会按照设定的周期(如每天、每周)无限重复执行,at 的任务管理相对简单,而 cron 提供了更灵活的周期配置(如分钟、小时、日、月、星期)和更复杂的任务调度能力。
问题 2:为什么 at 任务没有按预期时间执行?
解答:at 任务未按预期执行可能由以下原因导致:1)atd 守护进程未运行,可通过 systemctl status atd 检查并启动;2)时间格式错误或系统时区设置不当,建议使用绝对时间格式并确认时区;3)任务内容存在语法错误或权限不足,可通过 at -c [任务编号] 查看任务内容并调试;4)系统负载过高导致任务延迟,可结合 nice 命令调整优先级。
