Linux:查找进程使用的所有文件描述符

时间:2020-01-09 10:41:31  来源:igfitidea点击:

如何找到诸如httpd(Apache Web服务器)或mysqld(MySQL数据库服务器)之类的进程使用的所有文件描述符?
您可以使用/proc文件系统或lsof命令来查找进程使用的所有文件描述符。

/proc文件系统示例

首先,使用ps命令找出进程ID,执行:

# ps aux | grep processName
# ps aux | grep mysqld

输出示例:

root      3632  0.0  0.0  65944  1296 ?        S    Jun05   0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --user=mysql
mysql     3679  9.0  8.9 1393476 733756 ?      Sl   Jun05 3448:12 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock
root     44723  0.0  0.0  61188   820 pts/0    S+   17:48   0:00 grep mysqld

您还可以按以下方式使用pidof命令来查找命名程序的进程ID(PID):

# pidof processName
# pidof mysqld

输出示例:

3679

记下PID 3679。

/proc/$pid/fd目录示例

执行以下命令:

# ls /proc/3679/fd
# ls -l /proc/3679/fd

lsof命令示例

执行命令,如下所示:

# lsof -a -p {PID-HERE}
# lsof -a -p 3679

要查看有关使用的文件描述符的统计信息,请执行:

# cat /proc/3679/net/sockstat

输出示例:

sockets: used 183
TCP: inuse 5 orphan 0 tw 0 alloc 9 mem 2
UDP: inuse 9 mem 1
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

请注意,在较旧的内核(例如RHEL 5或Suse 9或Debian 4或5附带的内核)上,请使用名为/proc/net/sockstat的系统野生统计文件描述符文件:

# cat /proc/net/sockstat