at 命令本身并不是一个“协议测试工具”,而是一个定时任务调度器,它的作用是在指定的时间点执行一个或一系列的命令。

at 命令如何与“协议测试”联系起来呢?答案是:通过 at 命令,我们可以安排在未来的某个特定时间自动启动一个真正的协议测试脚本或程序。
这在进行协议测试时非常有用,
- 在业务低峰期执行压力测试:避免对生产环境造成干扰。
- 在特定时间窗口触发测试:模拟每天凌晨的数据同步。
- 组合使用
at和其他工具:如ping,curl,iperf,tcpdump等,实现复杂的自动化测试场景。
at 命令的基本用法
在深入协议测试之前,我们先快速回顾一下 at 命令的基本用法。
安装 at 命令
在某些 Linux 发行版(如 Ubuntu/Debian)中,at 可能默认未安装。

# 对于 Debian/Ubuntu sudo apt-get update sudo apt-get install at # 对于 CentOS/RHEL sudo yum install at
启动 atd 服务
at 命令依赖于 atd 后台服务,确保该服务正在运行。
# 检查 atd 服务状态 sudo systemctl status atd # 如果未运行,则启动并设置为开机自启 sudo systemctl start atd sudo systemctl enable atd
使用 at 命令创建定时任务
at 命令的交互式使用非常简单,在终端输入 at [时间],然后在新的一行输入你想要执行的命令,最后按 Ctrl + D 发送 EOF 信号来结束输入。
示例:
# 在明天下午 3 点执行一个简单的 echo 命令 at 3:00 PM tomorrow at> echo "协议测试将在明天下午3点开始" >> /var/log/test.log at> <EOT> # 按 Ctrl+D job 3 at Tue Dec 12 15:00:00 2025
时间格式非常灵活:

- 绝对时间:
at 10:30(今天上午10:30)at 23:00 2025-12-25(2025年12月25日晚上11点)at noon tomorrow(明天中午12点)at teatime friday(本周五下午4点)
- 相对时间:
at now + 1 hour(从现在起1小时后)at now + 30 minutes(从现在起30分钟后)at now + 3 days(从现在起3天后)
使用 at 进行协议测试的实践场景
下面我们通过几个具体的协议测试场景,来展示 at 命令的强大之处。
定时 HTTP/HTTPS 协议健康检查
假设你有一个 Web 服务,你想每天凌晨 2 点自动检查其可用性,并将结果记录到日志中。
测试脚本 (health_check.sh):
#!/bin/bash
# 定义目标 URL
TARGET_URL="https://www.example.com"
LOG_FILE="/var/log/health_check_$(date +%Y%m%d).log"
# 检查时间
CHECK_TIME=$(date)
# 使用 curl 进行测试,-s 表示静默模式,-o /dev/null 将输出丢弃,-w 指定输出格式
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$TARGET_URL")
# 记录结果
echo "[$CHECK_TIME] 检查 $TARGET_URL, 状态码: $HTTP_CODE" >> "$LOG_FILE"
# 根据状态码进行判断
if [ "$HTTP_CODE" -eq 200 ]; then
echo "[$CHECK_TIME] 服务正常" >> "$LOG_FILE"
else
echo "[$CHECK_TIME] 服务异常,状态码: $HTTP_CODE" >> "$LOG_FILE"
# 这里可以添加告警逻辑,比如发送邮件或调用Webhook
fi
使用 at 调度该脚本:
# 1. 给脚本添加执行权限 chmod +x health_check.sh # 2. 使用 at 命令设置每天凌晨2点执行 echo "/path/to/your/health_check.sh" | at 2:00 AM every day # 或者交互式输入 # at 2:00 AM every day # at> /path/to/your/health_check.sh # at> <EOT>
定时进行网络连通性测试 (Ping)
你想在明天上午9点测试到某个服务器的网络延迟和丢包情况。
使用 at 直接执行 ping 命令:
# 在明天上午9点,ping 8.8.8.8 5次,并将结果保存到 ping_log.txt at 9:00 AM tomorrow at> ping -c 5 8.8.8.8 > ping_log.txt at> <EOT>
定时进行 TCP 端口连通性测试 (Telnet/Netcat)
你想在每天下午5点检查一个特定端口(MySQL的3306端口)是否开放。
使用 at 和 nc (netcat) 命令:
# 在下午5点,检查192.168.1.100的3306端口是否开放 at 5:00 PM at> nc -zv 192.168.1.100 3306 at> <EOT>
nc: netcat 命令-z: 扫描模式,不发送数据,只连接端口。-v: 显示详细输出。- 这个命令会直接在终端输出连接结果(成功或失败)。
定时进行网络性能测试 (iPerf)
你想在周末进行一次网络带宽测试,以评估网络性能。iperf3 是一个很好的工具。
准备 iperf3 服务器端:在目标服务器上运行 iperf3 -s。
使用 at 在客户端发起测试:
# 在周六上午10点,连接到服务器 192.168.1.200 进行30秒的带宽测试 at 10:00 AM Saturday at> iperf3 -c 192.168.1.200 -t 30 > iperf_test_$(date +%Y%m%d).log at> <EOT>
测试完成后,结果会保存在以当天日期命名的日志文件中。
at 命令的进阶与注意事项
查看和管理 at 任务
-
查看当前用户的
at队列:atq
输出示例:
3 Tue Dec 12 15:00:00 2025 a user 5 Wed Dec 13 10:00:00 2025 a user -
删除一个
at任务: 使用atrm命令,后面跟上任务编号(atq列出的第一个数字)。atrm 3 # 删除任务号为3的定时任务
at 命令的权限和环境变量
-
权限:
at命令默认允许所有用户创建自己的定时任务,但管理员可以通过配置文件/etc/at.allow和/etc/at.deny来控制用户权限。/etc/at.allow存在,则只有该文件中列出的用户可以使用at。/etc/at.allow不存在,则检查/etc/at.deny,该文件中列出的用户不能使用at,其他用户都可以。- 如果两个文件都不存在,则只有
root用户可以使用at。
-
环境变量:
at任务运行在一个受限的 shell 环境中,它不会继承你当前终端的环境变量(如PATH,HOME等)。- 最佳实践:在
at任务中,始终使用命令的完整路径。 - 示例:如果你把
ping命令写进at,但at用户的PATH环境变量里没有/usr/bin,那么任务就会失败,正确的写法是/bin/ping或/usr/bin/ping。
- 最佳实践:在
使用 mail 发送测试结果
at 任务的标准输出和标准错误默认会通过 mail 命令发送给任务的创建者,这对于获取测试结果非常有用。
示例:
# 创建一个任务,它的输出会通过邮件发送给你 at now + 5 minutes at> echo "This is a test message from at command" | mail -s "AT Job Result" your-email@example.com at> <EOT>
在真实测试中,你可以将测试脚本的输出重定向到一个临时文件,然后通过 mail 发送该文件。
| 特性 | 描述 | 在协议测试中的应用 |
|---|---|---|
| 核心功能 | 定时执行命令 | 在预定时间(如低峰期)启动自动化测试脚本。 |
| 灵活性 | 支持多种时间格式(绝对/相对) | 可以精确控制测试的开始时间,明天凌晨”、“1小时后”。 |
| 组合性 | 可与任何命令行工具结合 | at + curl (HTTP测试), at + ping (连通性), at + iperf (性能), at + tcpdump (抓包)。 |
| 自动化 | 无需人工干预,实现“一次设置,自动执行” | 实现协议测试的完全自动化,解放人力。 |
| 环境隔离 | 在独立环境中运行,不继承当前终端的 PATH |
必须注意:在脚本中使用命令的绝对路径,避免因环境变量问题导致任务失败。 |
at 命令是协议测试自动化的一个“调度器”或“触发器”,它本身不执行测试,但它能让你的测试脚本在正确的时间、以自动化的方式运行起来,是构建复杂自动化测试流程中非常有用的一环。
