我打开了一个新问题,因为我原来的问题已经回答,并且不想改变主题。
我正在尝试监控多个连接进入两个独立的端口但具有相同的IP
实施例
netstat -an |grep 000
101.101.101.101:2000 ESTABLISHED
101.101.101.101:2000 ESTABLISHED
101.101.101.102:3000 ESTABLISHED
101.101.101.102:3000 ESTABLISHED
101.101.101.102:3000 ESTABLISHED
101.101.101.102:3000 ESTABLISHED
我尝试做的是使用nestat和awk来打印第1列,如果1001.1001.1001.1001:200在输出中不是2次而不是警报意味着如果一次停止仍然警告10.1001.1001.1001缺少一个连接
并且如果10.1001.1001.102:3000并不打印4次而不是警报,即使它在netstat输出中存在3次:
这是我当前的代码,除了IP只需要存在一次以使警报不失败时,这一切都很好:
connections=('101.101.101.101' '101.101.101.102')
running=( $(netstat -an |grep 000 |awk '{print $1}') )
non_running=()
for process_name in ${connections[@]}; do
if [[ "${running[*]}" == *$process_name* ]]; then
echo "$process_name is running"
else
echo "$process_name is not running"
fi
done
答案 0 :(得分:0)
我还不太清楚这些要求。您调用第一个字段$process_name
但在您的netstat输出中调用addr:port组合。 Linux和BSD上的实际输出都将协议作为第一个字段。此外,您似乎只关注已建立的连接,但是您使用netstat
' s -a开关也可以打印监听套接字?
因此,假设您的输出如上所示,我在Perl中这样做:
#!/usr/bin/perl
use strict;
use warnings;
my %minimum = (
'101.101.101.101:2000' => 2,
'101.101.101.102:3000' => 5,
);
my %count;
open my $fh, '-|', 'netstat -an' or die "could not run netstat: $!";
while(<$fh>) {
next unless /^([0-9.]+:\d+000) /;
$count{$1}++;
}
close $fh;
while(my ($ip_port, $min) = each %minimum) {
$count{$ip_port} ||= 0;
next if $count{$ip_port} >= $min;
print "$ip_port: need $min connections, found only $count{$ip_port}\n";
}
您可能必须在读取循环中调整正则表达式。我使用netstat -tpn
来获取活动的TCP连接和进程名称,其输出如下所示:
tcp 0 0 172.30.252.100:39056 52.216.18.58:80 ESTABLISHED 2000/chrome