理论上能正常运行ifconfig的Linux操作系统都可适用这个脚本(当然一般默认会安装perl),打印实时网卡流量和丢包数,好久前当时为了验证输出流量随手写的,多次想改得漂亮点,一直没动手,就这样吧,以免用的时候找不到
其实我还想评论自己一句:把Perl写得跟C语言新手一样,真是Perl的悲哀!!!
#!/usr/bin/perl -w
####################################
#print bps, pkt dropped per second
#Can get four nic
#HuiLi
####################################
use 5.010;
print "Sorry, please run the script with a NIC name as ARGV !\n" and exit if !@ARGV;
my $G = 1024 * 1024 * 1024;
my $M = 1024 * 1024;
my $K = 1024;
sub traffic_data {
my ($nic, $bps, $pkt) = @_;
if ($bps >= $G) {
$bps /= $G;
print "Nic $nic bps: " . substr($bps, 0, 5) . " Gbits/s dropped: $pkt pkts/s\n";
} elsif ($bps >= $M and $bps < $G) {
$bps /= $M;
print "Nic $nic bps: " . substr($bps, 0, 5) . " Mbits/s dropped: $pkt pkts/s\n";
} elsif ($bps >= $K and $bps < $M) {
$bps /= $K;
print "Nic $nic bps: " . substr($bps, 0, 5) . " Kbits/s dropped: $pkt pkts/s\n";
} elsif ($bps < $K and $bps >= 0) {
print "Nic $nic bps: " . substr($bps, 0, 5) . " bits/s dropped: $pkt pkts/s\n";
} else {
print "Nic $nic bps: " . 0 . " bits/s dropped: $pkt pkts/s\n";
}
}
sub nic_traffic {
my ($nic, $flag) = @_;
my $drop = $traffic = $pkt = $bps = 0;
state $last_traffic1 = $last_drop1 = 0;
state $last_traffic2 = $last_drop2 = 0;
state $last_traffic3 = $last_drop3 = 0;
state $last_traffic4 = $last_drop4 = 0;
open my($NIC), "ifconfig $nic |";
while(<$NIC>){
$drop = $1 if /\s+RX\s+packets.*dropped:(\d+)\s+.*/;
$traffic = $1 if /\s+RX\s+bytes:(\d+)/;
}
close($NIC);
if ($flag == 0){
$pkt = $drop - $last_drop1;
$bps = ($traffic - $last_traffic1) * 8;
traffic_data($nic, $bps, $pkt);
$last_traffic1 = $traffic;
$last_drop1 = $drop;
} elsif ($flag == 1){
$pkt = $drop - $last_drop2;
$bps = ($traffic - $last_traffic2) * 8;
traffic_data($nic, $bps, $pkt);
$last_traffic2 = $traffic;
$last_drop2 = $drop;
} elsif ($flag == 2){
$pkt = $drop - $last_drop3;
$bps = ($traffic - $last_traffic3) * 8;
traffic_data($nic, $bps, $pkt);
$last_traffic3 = $traffic;
$last_drop3 = $drop;
} elsif ($flag == 3){
$pkt = $drop - $last_drop4;
$bps = ($traffic - $last_traffic4) * 8;
traffic_data($nic, $bps, $pkt);
$last_traffic4 = $traffic;
$last_drop4 = $drop;
}
}
while(1){
my $flag = 0;
print "########################################################################\n";
foreach my $nic (@ARGV) {
nic_traffic($nic, $flag);
$flag = ($flag + 1) % 4;
}
select(undef, undef, undef, 1);
}
运行的时候最多可以带4个参数,也就是最多可以查看4个网口流量情况,想加参数的自行修改nic_traffic函数里的if/else,打印的第一次请无视,会减去上一秒(而上一秒根本没有)的结果,后面都是后一秒减去前一秒的数据,运行如下:
[lihui@localhost ~]# ./nic_traffic.pl eth0 xge0 xge1 ####################################################################################### Nic eth0 bps: 13.33 Kbits/s dropped: 0 pkts/s Nic xge0 bps: 9.073 Gbits/s dropped: 0 pkts/s Nic xge1 bps: 0 bits/s dropped: 0 pkts/s ####################################################################################### Nic eth0 bps: 23.27 Kbits/s dropped: 0 pkts/s Nic xge0 bps: 9.303 Gbits/s dropped: 0 pkts/s Nic xge1 bps: 0 bits/s dropped: 0 pkts/s ####################################################################################### Nic eth0 bps: 11.57 Kbits/s dropped: 0 pkts/s Nic xge0 bps: 9.494 Gbits/s dropped: 0 pkts/s Nic xge1 bps: 0 bits/s dropped: 0 pkts/s ####################################################################################### Nic eth0 bps: 9.187 Kbits/s dropped: 0 pkts/s Nic xge0 bps: 9.360 Gbits/s dropped: 0 pkts/s Nic xge1 bps: 0 bits/s dropped: 0 pkts/s ####################################################################################### Nic eth0 bps: 10.39 Kbits/s dropped: 0 pkts/s Nic xge0 bps: 9.490 Gbits/s dropped: 0 pkts/s Nic xge1 bps: 0 bits/s dropped: 0 pkts/s ####################################################################################### Nic eth0 bps: 13.14 Kbits/s dropped: 0 pkts/s Nic xge0 bps: 9.370 Gbits/s dropped: 0 pkts/s Nic xge1 bps: 0 bits/s dropped: 0 pkts/s
