at 命令是 Linux 系统中一个非常实用的定时任务工具,它允许用户在指定的时间点执行一次性的命令或脚本,与 cron 不同,cron 用于设置周期性重复的任务,而 at 则专注于执行一次性的任务,例如在未来的某个特定时间发送邮件、备份文件或执行维护脚本,本文将详细介绍 at 命令的使用方法、常用选项、实际应用场景以及注意事项。

at 命令的基本语法
at 命令的基本语法结构如下:
at [选项] 时间
时间 参数可以有多种格式,例如具体的时间点(如 14:30)、相对时间(如 now + 1 hour)、日期(如 tomorrow 10:00)等,执行 at 命令后,系统会进入交互式模式,用户需要输入要执行的命令或脚本内容,最后按 Ctrl + D 组合键结束输入。
at 命令的常用选项
at 命令提供了一些选项来控制任务的行为,以下是常用的选项及其说明:
| 选项 | 说明 |
|---|---|
-f 文件 |
从指定文件中读取要执行的命令,而不是从标准输入。 |
-l |
列出当前等待执行的所有 at 任务,等同于 atq 命令。 |
-d 任务号 |
删除指定的 at 任务,等同于 atrm 任务号 命令。 |
-m |
任务执行完成后,即使没有标准输出,也通过邮件发送任务执行结果。 |
-V |
显示 at 命令的版本信息。 |
-q 队列 |
指定任务要放入的队列(默认是 a,队列可以是 a 到 z 或 A 到 Z)。 |
at 命令的时间格式
at 命令支持多种时间格式,以下是常见的时间表示方法:

-
绝对时间:
- 具体时间点:
at 14:30(表示今天的 14:30 执行)。 - 具体日期和时间:
at 10:00 2023-12-31(表示 2023 年 12 月 31 日 10:00 执行)。 - 12 小时制时间:
at 2:30 PM(表示今天的下午 2:30 执行)。
- 具体时间点:
-
相对时间:
now + 时间单位:at now + 1 hour(表示当前时间后 1 小时执行)。at now + 10 minutes(表示当前时间后 10 分钟执行)。at now + 3 days(表示当前时间后 3 天执行)。
-
日期时间组合:
at tomorrow 09:00(表示明天的 09:00 执行)。at teatime(表示下午 4 点,teatime是at命令的内置别名)。at midnight(表示午夜 12 点)。at noon(表示中午 12 点)。
at 命令的使用步骤
使用 at 命令执行一次性任务通常包括以下步骤:

-
输入
at命令和时间: 在终端中输入at命令,并指定执行时间,设置任务在 1 小时后执行:at now + 1 hour
-
输入要执行的命令: 系统会进入交互式模式,提示用户输入要执行的命令或脚本内容。
at> echo "Hello, this is a test task" >> /tmp/test.log at> ls -l /tmp at> <Ctrl + D>
输入完成后,按
Ctrl + D组合键结束输入,系统会显示任务信息,job 3 at Mon Dec 11 14:30:00 20233是任务号,用于后续管理任务。 -
从文件读取命令: 如果需要执行的命令较多,可以先将命令写入文件,然后使用
-f选项指定文件。cat > task.sh << EOF #!/bin/bash echo "Task executed at $(date)" > /tmp/task_result.log EOF at now + 30 minutes -f task.sh
管理 at 任务
-
列出待执行任务: 使用
atq命令或at -l命令可以查看当前所有等待执行的at任务:atq
输出示例:
3 Mon Dec 11 14:30:00 2023 a user 4 Mon Dec 11 18:00:00 2023 a user第一列是任务号,第二列是执行时间,第三列是队列名称,第四列是用户名。
-
删除
at任务: 使用atrm命令或at -d命令可以删除指定的任务,需要提供任务号,例如删除任务 3:atrm 3
执行后,再次运行
atq命令会发现任务 3 已被移除。
at 命令的权限与安全
-
权限控制:
at命令的执行权限受到系统配置文件的限制,在/etc/at.deny和/etc/at.allow文件中可以控制哪些用户可以使用at命令。/etc/at.allow文件存在,则只有该文件中列出的用户可以使用at命令。/etc/at.allow文件不存在,则检查/etc/at.deny文件,该文件中列出的用户将被禁止使用at命令,其他用户可以使用。- 默认情况下,
/etc/at.deny文件可能包含daemon、bin、sys等系统用户,而普通用户默认可以使用at命令。
-
安全注意事项:
- 由于
at任务会在指定时间以当前用户的权限执行,因此需要确保执行的命令或脚本是安全的,避免执行恶意代码。 at任务需要较高权限,建议使用sudo执行at命令,但需注意权限传递的问题。
- 由于
at 命令的实际应用场景
-
定时发送邮件: 可以设置
at任务在特定时间发送邮件,at 09:00 tomorrow at> echo "This is a reminder: Meeting at 10:00 AM" | mail -s "Reminder" user@example.com at> <Ctrl + D>
-
定时备份文件: 使用
tar命令定时备份重要文件:at now + 2 days at> tar -czf /backup/important_files_$(date +%Y%m%d).tar.gz /path/to/important/files at> <Ctrl + D>
-
定时清理临时文件: 定期清理系统中的临时文件:
at 03:00 Sunday at> find /tmp -type f -mtime +7 -delete at> <Ctrl + D>
at 命令的注意事项
-
at守护进程:at命令的正常运行依赖于atd守护进程。atd服务未启动,at任务将无法执行,可以使用以下命令检查和启动atd服务:systemctl status atd systemctl start atd
-
任务执行环境:
at任务的执行环境可能与当前终端环境不同,例如环境变量、工作目录等,如果任务依赖特定的环境,建议在脚本中显式设置或使用source命令加载配置文件。 -
任务冲突: 如果多个
at任务在同一时间执行,可能会对系统资源造成压力,建议合理规划任务时间,避免资源竞争。
相关问答 FAQs
问题 1:如何查看 at 任务的执行结果?
解答:at 任务的执行结果默认会通过邮件发送到执行任务的用户邮箱,如果需要将结果输出到文件,可以在命令中重定向输出,
at now + 1 hour at> your_command > /tmp/task_output.log 2>&1 at> <Ctrl + D>
使用 -m 选项可以在任务没有标准输出时也强制发送邮件通知。
问题 2:at 任务被取消后是否可以恢复?
解答:at 任务被删除(通过 atrm 或 at -d)后无法直接恢复,如果需要恢复,只能重新创建任务,在删除任务前建议确认任务的必要性,或备份重要的任务命令。
