at命令是Linux/Unix系统中用于安排一次性任务在预设时间点执行的工具,用户指定具体时间或日期后输入要运行的命令或脚本,系统将在设定时刻自动执行该任务,常用于定时关机、备份等单次计划操作。
at
是一个在类 Unix 系统(如 Linux, macOS)和 Windows 系统上都存在的命令行工具,用于在指定的未来时间点执行一次性的任务,它就像一个精准的“定时触发器”,让你可以安排命令或脚本在服务器负载较低时、深夜维护窗口或任何特定时刻自动运行,无需人工值守。
核心功能:
- 单次调度: 安排任务只运行一次(与
cron
处理周期性任务不同)。 - 灵活的时间设定: 支持多种时间格式(具体时间、相对时间)。
- 后台执行: 任务在指定时间由系统后台进程自动执行。
- 标准输入/输出处理: 任务执行时的输出默认会通过邮件发送给提交者(可配置重定向)。
如何使用 at 命令(Linux/macOS 示例)
-
基本语法:
at [选项] <时间>
输入此命令后,你会进入
at>
提示符,等待输入要执行的命令,输入完成后,按Ctrl + D
提交任务。 -
指定时间 (
<时间>
):- 具体时间:
HH:MM
(24小时制,如14:30
),可加后缀指定日期:today
(默认)tomorrow
(明天)- 月份名 + 日期 (如
Jul 15
,Oct 31
) - 年份 (如
2025
) – 格式如14:30 Jul 15 2025
- 相对时间:
now +
+ 数字 + 时间单位- 单位:
minutes
,hours
,days
,weeks
(可缩写为min
,hr
,day
,wk
) - 示例:
now + 2 hours
,now + 30 min
,now + 1 week
- 单位:
- 特殊关键字:
noon
(中午12:00)midnight
(午夜00:00)teatime
(通常指下午16:00)
示例:安排任务在下午 3:30 执行
at 15:30 at> /path/to/your/script.sh at> echo "Task completed at $(date)" | mail -s "At Job Report" admin@example.com at> <EOT> # 按 Ctrl + D 提交 job 1 at Mon Jul 10 15:30:00 2025
- 具体时间:
-
从文件读取命令:
避免在提示符下输入,可将命令写入脚本文件,用-f
选项指定:at 02:00 tomorrow -f /home/user/nightly_backup.sh
-
管理已安排的作业:
- 查看队列 (
atq
或at -l
): 列出当前用户的所有待执行at
作业及其编号。atq # 输出示例: 1 Mon Jul 10 15:30:00 2025 a user
- 删除作业 (
atrm
或at -d
): 使用atq
得到的作业编号删除。atrm 1 # 删除作业编号为 1 的任务
- 查看作业内容 (
at -c <作业编号>
): 显示指定作业将要执行的具体命令和环境。at -c 1
- 查看队列 (
-
处理输出:
默认情况下,at
任务的标准输出和标准错误会通过邮件发送给提交任务的用户,如需改变:- 重定向到文件: 在
at>
提示符下或脚本文件中使用>
或>>
。at now + 1 hour at> /path/to/command > /tmp/command_output.log 2>&1 at> <EOT>
- 丢弃输出: 重定向到
/dev/null
。at> /path/to/command > /dev/null 2>&1
- 重定向到文件: 在
Windows 系统中的 at 命令 (注意:较新系统推荐 schtasks
)
-
基本语法 (命令提示符
cmd
):at [\\computername] <时间> [/interactive] [/every:date[,...] | /next:date[,...]] "命令"
\\computername
: 在远程计算机上安排任务(需权限)。<时间>
: 24小时制HH:MM
。/interactive
: 允许任务与用户桌面交互(不推荐用于服务,有安全风险)。/every
和/next
: Windowsat
不支持单次任务指定未来日期,它本质上是为周期性任务设计的(这是与Unix版的主要区别)。/every
指定每周或每月的哪些天运行,/next
指定下个周几或几号运行,要模拟单次任务,通常需在任务执行后安排它删除自身,或使用更强大的schtasks
。"命令"
: 要执行的命令或程序完整路径,用双引号括起来。
-
示例 (安排明天凌晨 2 点重启 – 需管理员权限):
at 02:00 /next:Tuesday "shutdown /r /f /t 0"
/next:Tuesday
: 下周二运行(如果今天是周一,则明天周二运行;如果今天是周三,则下周二运行),这不是理想的单次任务指定方式。- 强烈建议在 Windows 上使用
schtasks
代替at
进行单次调度:schtasks /create /tn "MyOneTimeTask" /tr "C:\MyScript.bat" /sc once /st 02:00 /sd 2025-07-15
(
/sd
指定具体日期/st
指定时间,完美支持单次任务)。
-
管理 Windows at 作业:
- 查看:
at
(不带参数) - 删除:
at <作业编号> /delete
- 查看:
重要注意事项与安全提示 (E-A-T 关键点)
-
权限控制:
- Linux/macOS: 访问由
/etc/at.allow
和/etc/at.deny
文件控制,默认通常允许所有用户,系统管理员应严格管理这些文件,仅允许必要用户(如root
, 特定服务账户)使用at
,防止滥用。最佳实践: 删除空的at.deny
文件,创建at.allow
并只添加授权用户。 - Windows: 需要管理员权限才能创建系统级任务(如重启),普通用户只能创建自己的任务。
- Linux/macOS: 访问由
-
环境变量:
at
任务执行时继承的环境变量可能与你的登录Shell不同(尤其是.bashrc
/.profile
中的设置)。关键脚本中务必使用命令的绝对路径 (如/usr/bin/myscript
而非myscript
),或在脚本开头显式设置所需环境变量。 -
输出处理: 务必考虑命令或脚本的输出(日志、错误),默认邮件通知可能被忽略或失败。强烈建议在任务内部将输出重定向到日志文件,并确保日志轮转机制到位。
-
依赖关系: 确保任务运行时所需的程序、文件、网络资源、挂载点等都已就绪,考虑系统状态(如是否已开机 –
at
任务只在系统运行时触发)。 -
替代方案:
cron
(Linux/macOS): 处理周期性任务的黄金标准。anacron
(Linux): 为不总是开机的桌面/笔记本设计的cron
替代品,保证任务在开机后执行。systemd timers
(现代 Linux): 更强大、集成度更高的定时任务系统,依赖systemd
。schtasks
(Windows): 功能远超at
,是管理计划任务的现代命令行工具和图形界面(任务计划程序)的基础。对于新的 Windows 单次任务,优先使用schtasks
。
-
安全审计: 定期检查
at
作业队列 (atq
/at -l
/ Windowsat
),移除不再需要或可疑的任务,监控系统日志(如 Linux 的/var/log/syslog
或journalctl -u atd
)查看at
任务执行情况。
适用场景举例 (体现价值)
- 服务器维护: 在凌晨低峰时段执行数据库备份 (
mysqldump
)、日志清理 (logrotate
)、应用重启。 - 资源密集型任务: 安排大型编译、数据处理任务在夜间或周末运行。
- 延迟通知/提醒: 发送定时提醒邮件或消息(需配置好邮件发送)。
- 自动化测试: 在特定时间触发测试套件运行。
- Windows 特定: 安排一次性系统重启(如安装更新后,但
schtasks
更好)。
at
命令是实现单次定时任务自动化的经典工具,在 Linux/macOS 上功能直接且强大,使用时需注意环境变量和输出处理,在 Windows 上,其功能有限且设计初衷是周期性任务,强烈建议使用 schtasks
替代进行单次调度,无论何种系统,严格控制用户权限、清晰管理任务队列、妥善处理任务输出并定期审计,是安全有效使用 at
命令的关键,对于复杂的或周期性的自动化需求,应评估更专业的工具如 cron
或 systemd timers
(Linux) 及 schtasks
/任务计划程序 (Windows)。
引用说明:
- Linux
at
命令手册页 (man at
,man atd
,man at.allow
) - GNU Coreutils 文档 (包含
at
):https://www.gnu.org/software/coreutils/manual/ - Microsoft Windows
at
命令文档:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/at (明确说明其局限性并推荐schtasks
) - Microsoft Windows
schtasks
命令文档:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/schtasks
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/7236.html