at命令核心功能:在指定时间点执行一次性任务,适用于需要精准调度的场景(如系统维护、数据备份、程序测试)。
基础安装与检查
-
安装at守护进程 (通常系统已预装)
- Debian/Ubuntu:
sudo apt update && sudo apt install at
- CentOS/RHEL:
sudo yum install at
- 启动并设置开机自启:
sudo systemctl enable --now atd # 大多数现代系统 sudo service atd start # 旧式SysVinit系统
- Debian/Ubuntu:
-
验证服务状态
systemctl status atd # 或 service atd status
at命令核心语法与时间设定
at [选项] <时间>
-
<时间>
格式 (非常灵活):- 标准时间:
HH:MM
(24小时制,如14:30
)默认当天执行,若已过该时间则顺延到次日。
- 日期+时间:
HH:MM YYYY-MM-DD
(如23:00 2025-10-01
)HH:MM MM/DD/YY
(如10:00 12/25/24
)HH:MM + 天数
(如09:00 + 3 days
)
- 相对时间:
now + 数量 单位
(单位:minutes
,hours
,days
,weeks
,可简写为min
,hr
,day
,wk
)- 示例:
now + 2 hours
(2小时后)now + 30 min
(30分钟后)4 PM tomorrow
(明天下午4点)noon + 1 week
(下周中午12点)
- 特殊关键字:
midnight
(午夜),noon
(中午),teatime
(下午4点,某些系统支持)。
- 标准时间:
-
常用选项:
-f <文件>
:从指定<文件>
中读取要执行的命令,而非标准输入。-m
:即使命令没有输出,也在任务完成后给用户发送邮件。-M
:永不发送邮件(即使命令有输出)。-l
:列出当前用户的所有待处理任务 (等同于atq
命令)。-r <任务号>
/-d <任务号>
:删除指定<任务号>
的任务 (等同于atrm <任务号>
命令)。-c <任务号>
:查看指定<任务号>
任务的详细内容(包含环境变量和具体命令)。-q <队列字母>
:指定任务队列(默认为a
队列,队列字母从a
到z
或A
到Z
,字母越靠后优先级越低)。
使用at执行任务 (两种主要方式)
-
交互式输入命令 (最常用):
- 输入
at 时间
(如at 15:30
或at now + 1 hour
)。 - 按回车后,进入
at>
提示符。 - 逐行输入需要执行的命令 (每行一条)。
- 输入完成后,按
Ctrl + D
(EOF) 结束输入并提交任务。
- 示例: 创建一个明天上午10点的空文件
$ at 10:00 tomorrow at> touch /tmp/reminder_file.txt at> <EOT> # 这里按 Ctrl+D job 3 at Tue Jul 2 10:00:00 2025
- 输入
-
从文件读取命令 (
-f
选项):- 将需要执行的命令写入一个脚本文件 (如
myjob.sh
),确保脚本有可执行权限 (chmod +x myjob.sh
) 或使用解释器执行 (如bash myjob.sh
)。 - 使用
at -f
指定该文件。
- 示例: 1小时后执行备份脚本
$ at -f /path/to/backup_script.sh now + 1 hour job 4 at Mon Jul 1 16:25:00 2025
- 将需要执行的命令写入一个脚本文件 (如
管理at任务
-
查看待处理任务 (
atq
或at -l
):$ atq 3 Tue Jul 2 10:00:00 2025 a username 4 Mon Jul 1 16:25:00 2025 a username
输出列:任务号、执行时间、队列、所有者。
-
删除任务 (
atrm <任务号>
或at -r <任务号>
):$ atrm 4 # 删除任务号4 $ atq 3 Tue Jul 2 10:00:00 2025 a username # 任务4已删除
-
查看任务详情 (
at -c <任务号>
):$ at -c 3 # 输出会很长,包含大量环境变量设置信息,滚动到最后可以看到你输入的命令: ... cd /home/username || { echo 'Execution directory inaccessible' >&2 exit 1 } umask 22 ... # 更多环境变量 touch /tmp/reminder_file.txt # 这是你输入的命令
关键注意事项与高级技巧
-
环境变量: at任务执行时不会继承当前Shell的所有环境变量(特别是非导出的变量和
.bashrc
等配置),它使用一套最小化环境,如需特定环境:- 在at命令中显式设置变量 (如
at> export PATH=/my/path:$PATH; mycommand
)。 - 在执行的命令/脚本内部设置所需环境。
- 使用
-c
查看任务时会看到at设置的基础环境。
- 在at命令中显式设置变量 (如
-
输出处理:
- 命令的标准输出和标准错误默认会通过邮件发送给提交任务的用户(发送到本地邮箱,如
/var/mail/username
)。 - 使用
-m
强制发送邮件(即使无输出),使用-M
禁止发送邮件。 - 最佳实践: 在命令中显式重定向输出到文件或
/dev/null
,避免依赖邮件。at> mycommand > /path/to/output.log 2>&1 # 合并stdout和stderr到文件 at> anothercommand > /dev/null 2>&1 # 丢弃所有输出
- 命令的标准输出和标准错误默认会通过邮件发送给提交任务的用户(发送到本地邮箱,如
-
用户权限:
- 普通用户只能管理自己提交的at任务。
- root用户可以管理所有任务(使用
atq
和atrm
时默认看到所有用户任务)。 - 访问控制通过
/etc/at.allow
和/etc/at.deny
文件管理:at.allow
存在,只有其中列出的用户可以使用at。at.allow
不存在,检查at.deny
,其中列出的用户不能使用at。- 如果两个文件都不存在,只有root可以使用at (大多数系统默认有空的或包含特定用户的
at.deny
,允许所有用户使用)。
-
at
vscron
:at
: 一次性任务,在特定时间点执行,适合临时、不重复的任务。cron
: 周期性重复执行的任务(如每天、每周、每月),适合计划性、规律性的任务,两者用途互补。
-
系统限制 (systemd 系统):
在默认使用systemd
的现代Linux发行版上,atd
服务可能被systemd
的临时定时器单元替代。at
命令通常仍能正常工作,但后台机制可能不同,了解这一点有助于排查复杂问题。
实用示例场景
-
下班后执行长时间任务:
$ at 8:00 PM at> /usr/bin/long_running_process --input bigdata.dat --output results.out > /home/me/longjob.log 2>&1 at> <EOT>
-
提醒功能:
$ at 15:45 at> echo "别忘了下午4点的会议!" | wall # 广播给所有登录用户(需权限) # 或仅发送给自己 (需要邮件服务或终端消息工具) at> echo "会议提醒" | mail -s "重要会议" me@example.com at> <EOT>
-
定时关机/重启:
$ at 02:30 at> sudo shutdown -h now # 立即关机(需要sudo权限) # 或 at> sudo reboot at> <EOT> # 更安全的做法是使用绝对路径 at> /usr/sbin/shutdown -h now
-
创建临时备份快照:
$ at now + 30 min at> /usr/bin/rsync -avz /important/data/ /backup/hourly-snapshot/ at> <EOT>
安全与最佳实践
- 权限最小化: 避免在at任务中以root身份执行非必要操作,尽量使用普通用户权限。
- 输出重定向: 始终处理命令输出,避免不可预知的邮件通知。
- 脚本封装: 复杂任务应写入脚本文件,通过
at -f
调用,提高可读性和可维护性。 - 日志记录: 在脚本中添加日志记录功能,便于追踪任务执行情况。
- 访问控制: 在共享服务器或多用户环境,严格配置
/etc/at.allow
和/etc/at.deny
。 - 替代方案评估: 对于需要复杂错误处理或资源管理的任务,考虑使用更强大的工具如
systemd
定时器或专业作业调度系统。
引用说明综合了Linux
at
命令手册页 (man at
)、IBM Documentation关于at/cron的对比、以及Linux系统管理最佳实践,具体实现细节可能因Linux发行版和版本略有差异,建议查阅系统自带手册 (man at
,man atd
,man at.allow
) 获取最准确信息。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/8760.html