Linux系统中的at命令是一个强大的工具,用于在指定的时间执行一次性任务,与cron不同,at适合临时或非周期性的定时任务,本文将详细介绍at命令的使用方法、工作原理、常见场景及注意事项,帮助用户高效管理定时任务。

at命令的基本概念与安装
at命令属于at软件包,大多数Linux发行版默认已安装,若可通过包管理器安装,如Ubuntu/Debian使用sudo apt install at,CentOS/RHEL使用sudo yum install at,安装完成后,需启动atd守护进程(sudo systemctl start atd),并设置为开机自启(sudo systemctl enable atd),该进程负责解析并执行at队列中的任务。
at命令的核心语法与参数
at命令的基本语法为at [选项] 时间,常用选项包括:
-f:从指定文件读取任务命令,而非交互式输入。-l或atq:列出当前用户的at队列任务。-d [任务号]或atrm [任务号]:删除指定任务。-m:任务执行后发送邮件通知用户。-v:显示任务执行的时间戳。
时间参数支持多种格式,
- 绝对时间:
10:30(当天10:30)、2025-12-31 23:59(指定日期时间)。 - 相对时间:
now + 5 minutes(5分钟后)、noon tomorrow(明天中午)。 - 特殊关键字:
teatime(下午16:00)、midnight(午夜)。
交互式创建at任务
用户可直接输入at 时间进入交互式界面,输入命令后按Ctrl+D提交,在10分钟后执行系统备份:

at now + 10 minutes at> tar -czf /backup/$(date +%Y%m%d).tar.gz /home at> <EOT> job 5 at Wed Dec 20 10:15:00 2025
提交后,系统返回任务编号(如job 5),可通过atq查看队列状态,任务执行时,at会使用当前用户的权限和环境变量,若需指定环境,可通过at -f script.sh或直接在交互式会话中设置。
通过文件创建at任务
对于复杂任务,建议先编写脚本文件(如backup.sh),再通过at -f backup.sh 时间提交。
cat > backup.sh <<EOF #!/bin/bash rsync -av /data/ /backup/data_$(date +%F)/ EOF chmod +x backup.sh at -f backup.sh 2025-12-25 02:00
此方式适合需要多次复用的任务,且脚本可提前调试,减少输入错误。
at队列的管理与监控
- 查看任务:
atq或at -l列出当前用户的任务,显示格式为任务号 时间 队列标识,5 Wed Dec 20 10:15:00 2025 a 6 Fri Dec 25 02:00:00 2025 a - 删除任务:使用
atrm 任务号,如atrm 5取消任务5。 - 查看任务详情:
at -c 任务号可显示任务的完整命令和执行环境,便于调试。
at命令的高级应用场景
- 系统维护窗口:在低峰期执行资源密集型任务,如:
at 02:00 -f /scripts/cleanup.sh
- 定时数据同步:通过
at结合inotify工具,在文件变化后触发同步:inotifywait -e modify /data/file.txt && at now -f /scripts/sync.sh
- 邮件通知:使用
-m选项,任务完成后将输出结果发送到用户邮箱:at -m now + 1 hour <<EOF echo "任务已完成" | mail -s "通知" user@example.com EOF
at命令的注意事项
- 权限限制:普通用户只能管理自己的任务,需
root权限才能执行系统级任务。 - 环境变量:
at任务继承提交时的环境变量,若需自定义环境,可在脚本中设置或使用at -f script.sh -v VAR=value。 - 时间精度:
at依赖系统时间,需确保ntpd或chrony等服务同步时间。 - 任务冲突:避免同一时间提交多个资源竞争任务,可通过
flock或锁文件机制控制。
at与cron的对比
| 特性 | at命令 |
cron |
|---|---|---|
| 执行频率 | 一次性任务 | 周期性任务(分钟/小时/日/月/年) |
| 时间格式 | 灵活(绝对/相对/特殊关键字) | 固定格式(分时日月周) |
| 任务管理 | 通过任务号增删 | 编辑crontab文件 |
| 适用场景 | 临时、非重复任务 | 定期维护、日志轮转等 |
| 资源占用 | 低(按需触发atd) |
高(crond持续运行) |
常见问题与解决方案
- 任务未执行:检查
atd服务状态(systemctl status atd),确认时间格式正确,查看/var/log/atd.log排查错误。 - 权限不足:若用户无法提交任务,确认是否在
/etc/at.allow(白名单)或不在/etc/at.deny(黑名单)中,默认仅允许root和at.allow中的用户。
相关问答FAQs
Q1: 如何查看at任务的执行日志?
A1: at任务的执行日志通常位于/var/log/atd.log或/var/log/syslog,可通过grep "atd" /var/log/syslog过滤相关日志,或使用journalctl -u atd(systemd系统)查看实时日志,若任务输出未记录,需在脚本中手动添加日志写入命令,如echo "任务开始" >> /var/log/at_task.log。

Q2: at任务能否在指定用户下执行?
A2: 可以,普通用户可通过sudo -u username at 时间提交任务,但需配置sudoers文件允许该用户执行at命令,在/etc/sudoers中添加username ALL=(ALL) /usr/bin/at,然后用户执行sudo -u username at now + 1 hour,任务将以username的身份运行。
