我正在打开一个新问题,因为我的原始问题已得到解答,并且不想更改主题。
我正在尝试监控进入两个独立端口但具有相同 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 在 netstat 输出中出现了 3 次,也没有准确地打印 4 次警报:
这是我当前的代码,除了 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
最佳答案
我对要求还不是很清楚。您将第一个字段称为 $process_name
但在您的 netstat 输出中它将是 addr:port 组合。 Linux 和 BSD 上的实际输出都将协议(protocol)作为第一个字段。此外,您似乎只在寻找已建立的连接,但您使用 netstat
的 -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
关于linux - 如果使用相同 IP/端口的连接断开,则 Shell 脚本警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46574847/