为了开发设备监控系统,我使用InetAdress isReachable
方法来了解网络中的设备是否在线。我正在使用ScheduledExecutorService
以及设备列表来同时ping icmp
设备。
现在,如果设备数量较少(例如60个设备)要由ScheduledExecutorService
ping有10个线程池,则可以正常工作。平均结果将正确显示设备状态。此处isReachable
超时5000毫秒
如果将设备数量增加到80个,即使设备处于联机状态,某些设备也会使用isReachable
方法显示脱机状态。如果将isReachable
方法的超时时间增加到10000 ms,则设备状态可能会更好具有正确的状态。
对于这些设备,大多数设备都是基于Linux的系统,isReachable
始终会为它们返回正确的状态,但是对于Windows,其行为是不可预测的。
我想确保网络上设备的状态始终正确。通过启动Java进程来查看联机设备的退出值0,也可以有一种替代机制。
例如“ Process proc = new ProcessBuilder("ping", host).start();
”
那么,有什么专家会建议?如上所述的具有Process
的设备的检查状态是否会比isReachable
调用更好和更可靠?
最佳答案
在子流程中运行ping不可能使情况变得更好。虽然Java进程的负载将减少,但是您只是在一台机器上转移它。 (此外,由于ICMP ECHO(ping的标准核心)的工作方式,我不确定您是否真的可以一次从一台主机一次对多台计算机执行ping操作。)您可能遇到的另一个问题是一台机器可以响应ping而实际上无法有效地到达它;我见过一些机器在运行内核(使其可ping通),但是没有正在运行的用户进程,并且您可以轻松地想象机器上特定的有趣服务正在关闭。 (此外,某些防火墙阻止ping。)使用与该机器上运行的真实服务的某种虚连接可以实际检测每台机器是否正常工作,这要好得多。
如果您确实要跟踪大量计算机的状态,则应考虑使用为该任务设计的软件(例如Nagios)。对于ServerFault而言,与其说是堆栈溢出,不如说是一个问题。
关于java - 关于InetAddress的“isReachable”方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11079646/