分类: 系统运维
2011-12-09 13:20:35
在AIX系统下如何知道在给定端口侦听的进程?
一、前言
在使用AIX操作系统时,用netstat命令能很容易看到系统内有哪些端口被占用了,哪些端口有进程在侦听。但是,要想知道在给定端口上侦听的进程是什么,恐怕就不那么容易了。IBM AIX 5L上的rmsock命令能输出侦听在网络地址的进程PID。本文详细介绍了用Shell输出在端口侦听的进程信息的实现原理和脚本封装方法。对于急于看到效果的读者可以直接阅读第四小节,先了解该脚本的用法,有兴趣时回过头再阅读第二小节和第三小节,进一步了解实现原理和如何设计脚本。
二、实现原理
它的实现原理是:用netstat命令查询在给定端口侦听的网络地址,调用rmsock命令显示在网络地址侦听的进程PID,调用ps命令显示活动进程的完整信息。
它的核心是rmsock命令,rmsock命令是IBM AIX 5L系统自带的命令。该命令的功能是删除网络地址对应的套接字,假如使用套接字的进程已经退出或者被杀死,该套接字将被从系统内删除,网络地址可以重新使用。假如使用套接字的进程仍然存在,该命令会提示套接字被进程使用,并显示进程号PID。
下面以telnet端口23为例,演示一下手工方式调用命令获得进程PID的过程:
* 看网络地址
netstat -Aan | grep *.23
执行上述命令后,系统输出如下:
f100060003652398 tcp 0 0 *.23 *.* LISTEN
*.23表示在端口23侦听的网络地址,*代表该主机的任意IP地址。
f100060003652398 是该套接字的(16进制表示的)系统内核地址。
* 看进程PID
rmsock f100060003652398 tcpcb
执行上述命令后,系统输出如下:
The socket 0x3652008 is being held by proccess 332008 (inetd).
显然,占用网络地址的进程PID是 332008,进程执行映像是inetd。
* 看进程的详细信息
ps -efl | grep 332008
执行上述命令后,系统输出如下:
240001 A root 332008 393220 0 60 20 40214400 448 12月21 - 0:01 /usr/sbin/inetd
其中第4列是进程PID,最后一列是进程执行映像的完整路径。
至此,进程的完整信息都被暴露出来,我们的目标基本达到了。不过用了三条命令才达到目标,在日常系统管理过程中显得相当繁琐,作者使用Shell脚本把三条命令整合到一起,方便大家使用。