【发布时间】:2013-08-14 02:15:47
【问题描述】:
我正在编写一个脚本来安排我的一些服务器上的端口检查,并报告状态。我打算选择以下两种选择之一:
-
将 netcat (nc) 的输出通过管道传递到 perl 变量中,并检查返回状态
my $rcode=`nc -z 6.6.6.6 80; echo $?` -
使用 perl 模块 IO::Socket::PortState 来做同样的事情。
use IO::Socket::PortState qw(check_ports); my %porthash = ( ... ); check_ports($host,$timeout,\%porthash); print "$proto $_ is not open ($porthash{$proto}->{$_}->{name}) if !$porthash{$proto}->{$_}->{open};
我想走更高效(时间更短,更具体)的路线。
这方面有经验法则吗?就像在管道中一样,系统命令/unix 实用程序的输出比使用 perl 模块效率更高/更低?还是不同的 perl 模块不同,只有通过设置这些检查的多次迭代并比较执行 unix 实用程序的系统调用所花费的时间,才能检查相同的模块?
【问题讨论】:
-
是的。经验法则是对其进行基准测试。
-
基准测试——当然。我只想补充一点,您应该明确说明“高效”的含义。
-
我的意思是节省时间和精确(更少的错误值)。
-
你可以考虑使用Socket;直接地。因为这是 perl 的基线套接字实现,并且是来自 c 的近乎直接的映射,所以它应该是在 perl 中执行此操作的最佳方法。尽管此时您可能很容易用 C 语言编写它,但 Socket.pm 与 socket.h 非常接近
标签: perl unix tcp port perl-module