在服务器巡检或网络设备维护中,经常需要一次性确认多台主机是否在线,并统计每台设备的平均延迟和丢包情况。pingr 包封装了系统自带的 ICMP 探测能力,在 R 语言中可以直接调用,非常适合批量检测和结果整理。下面会从安装和单台主机检测开始,逐步延伸到多主机批量处理与统计输出。

安装并了解 pingr 的基础用法
在正式使用之前,需要先安装并加载 pingr 包。安装命令为 install.packages("pingr"),加载则使用 library(pingr)。该包的核心函数是 ping(),它会向指定主机发送 ICMP 请求,并返回一个数值向量。向量中的每个元素表示一次往返所花费的时间,单位是秒;如果某个探测包在规定时间内没有收到回应,对应位置会返回 NA。这意味着我们可以直接根据返回向量里是否包含有效数值来判断主机是否存活。
例如对局域网内的一台设备执行四次探测,可以写成下面这样。代码中的 count 参数控制发包数量,timeout 参数设置单次探测的超时时间,单位同样是秒。需要注意的是,如果目标主机完全不可达,返回值可能是一个全部为 NA 的向量,而如果主机名无法解析,ping() 会抛出错误。这一点对后续批量处理很重要。
library(pingr)
result <- ping("192.168.1.1", count = 4, timeout = 1)
print(result)
is_alive <- any(!is.na(result))
avg_latency_ms <- mean(result, na.rm = TRUE) * 1000
cat("存活状态:", is_alive, "\n")
cat("平均延迟:", avg_latency_ms, "毫秒\n")
批量检测多台主机的实现方式
当检测目标从一台变成几十台甚至上百台时,继续手动逐个调用 ping() 效率太低。比较通用的做法是准备一个主机列表,然后使用 lapply() 或循环来遍历。每个主机执行一次探测,并把原始结果整理成一行记录。这里需要特别注意错误处理:如果列表中的某个主机名拼写错误,或者 DNS 解析失败,ping() 会直接抛错,如果不做处理,整个批量流程就会中断。可以用 tryCatch() 把单次探测包装起来,让异常主机返回一条存活状态为 FALSE 的记录,而不是终止脚本。
下面这段代码演示了完整的批量检测流程。把一个主机字符串传给自定义函数 ping_one(),函数内部发送三次探测包,并计算是否存活、平均延迟和丢包率。无论探测成功还是解析失败,函数都会返回一个包含相同字段的 data.frame,最后用 do.call(rbind, ...) 把多行结果合并成一张总表。这样的结构非常适合后续筛选和统计。
hosts <- c(
"192.168.1.1",
"192.168.1.2",
"192.168.1.3",
"www.baidu.com",
"nonexistent-host"
)
ping_one <- function(host) {
tryCatch({
res <- ping(host, count = 3, timeout = 1)
data.frame(
host = host,
alive = any(!is.na(res)),
avg_ms = if (any(!is.na(res))) mean(res, na.rm = TRUE) * 1000 else NA,
loss_rate = sum(is.na(res)) / length(res)
)
}, error = function(e) {
data.frame(host = host, alive = FALSE, avg_ms = NA, loss_rate = 1)
})
}
results <- do.call(rbind, lapply(hosts, ping_one))
print(results)
对于几十台以内的小规模检测,上面的循环方式已经完全够用,因为每次 ping() 执行的耗时主要取决于网络往返和超时。如果主机数量非常多,或者需要把所有主机的探测时间尽量压缩到同一时刻,可以考虑使用 parallel 包中的 mclapply() 或 parLapply() 来并行执行。但在并行之前要注意两点:一是 ICMP 探测本身受系统资源和网络带宽影响,并发过高可能触发限流;二是 Windows 系统上 mclapply() 不支持多核分叉,需要改用 socket 方式。日常巡检中,先把批次控制在百台以内,并设置合理的 timeout,通常比盲目增加并发更稳定。
汇总统计与结果输出
批量检测完成后,得到的结果表已经可以回答最直接的问题:哪些主机在线、哪些离线、每台设备的平均延迟和丢包率。如果想做整体分析,可以用基础统计函数快速获得汇总信息。例如对 avg_ms 列执行 summary(),可以查看最小延迟、中位数、平均值和最大延迟。存活主机数量则可以直接对 alive 列求和。对于那些延迟明显偏高的设备,可以按平均延迟排序,优先排查网络拥塞或交换机负载。
下面这段代码展示了如何查看汇总结果,并把最终表格写入 CSV 文件。将结果落盘的好处是方便历史对比,比如每天运行一次脚本并保存不同文件名,后续就能分析某台服务器在一段时间内的延迟波动。如果只是临时巡检,也可以直接在 RStudio 的 Viewer 中查看 results 对象。
summary(results$avg_ms)
alive_count <- sum(results$alive)
cat("在线主机数:", alive_count, "台\n")
ordered_results <- results[order(results$avg_ms), ]
print(ordered_results)
write.csv(results, "network_check.csv", row.names = FALSE)
除了导出表格,还可以用基础绘图函数观察延迟分布。比如使用 boxplot() 查看所有在线主机平均延迟的箱线图,异常点往往代表网络抖动明显的设备。如果希望在无人值守的情况下定期执行,可以把上面的脚本保存成 R 文件,并交给系统计划任务或 cron 定时运行。每次运行时在结果中追加时间戳,就能形成一条简单的延迟监控曲线。pingr 包的优势也在这里体现:它足够轻量,不需要额外安装服务端组件,几条 R 代码就能完成大部分内网探测工作。