######################################################
# QueryPortL.pl
# 根据端口查询对应的进程(Suse Linux 版本)
# Author: Rick Cheng
# Date: 2005-10-29
# Version: 1.0
######################################################
#! /usr/bin/perl -w
use strict;
my @portList; #端口号列表
foreach (@ARGV)
{
push @portList, $_ if (/^[^-]/d+$/);
}
&checkUsage();
print "PORT/tPID/tCOMMAND/n"; #输出表格头
foreach (@portList)
{
my $port = $_;
my $pid = undef;
#根据端口定位PID
`lsof -i:$port > ./QueryPortL.port`;
open TMP, "./QueryPortL.port" or die "Can't open QueryPortL.port: $!";
my $index = 0;
while (<TMP>)
{
chomp;
if ($index == 1)
{
my @tokenList = split;
$pid = $tokenList[1];
}
$index++;
}
close TMP;
`rm ./QueryPortL.port`;
#未找到PID,跳出本次循环
unless (defined $pid)
{
print "$port/tNA/tNA/n";
next;
}
#根据PID定位进程名
`ps -ef | grep $pid | grep -v grep > ./QueryPortL.pid`;
open TMP, "./QueryPortL.pid" or die "Can't open QueryPortL.pid: $!";
while (<TMP>)
{
chomp;
my @tokenList = split;
if ($tokenList[1] == $pid)
{
print "$port/t$pid/t$tokenList[7]/n";
last;
}
}
close TMP;
`rm ./QueryPortL.pid`;
}
print ":Done!/n";
#检测命令行输入
sub checkUsage()
{
if ($#portList == -1)
{
print "[USAGE] perl QueryPortL.pl port1 port2 .../n";
exit -1;
}
}