我需要列出每个进程以及该进程打开的文件描述符数量,以便我可以确定哪些进程保留了太多打开的文件。不,我不需要像其他问题所询问的那样只需要一个进程的打开文件数。我需要知道每个正在运行的进程的编号,最好按降序排列。
lsof 似乎不能做到这一点。有没有其他实用程序或东西可以完成此任务?
答案1
我会做类似的事情:
sudo lsof -FKc |
awk '
function process() {
if (pid || tid) {
print n, \
tid ? tid " (thread of " pid ": " pname")" : pid, \
name
n = tid = 0
}
}
{value = substr($0, 2)}
/^p/ {
process()
pid = value
next
}
/^K/ {
tid = value
next
}
/^c/ {
name = value
if (!tid)
pname = value
next
}
/^f/ {n++}
END {process()}' | sort -rn
对于开放数量文件,并替换/^f/
为/^f[0-9]/
打开的数量文件描述符。
答案2
这至少适用于 Solaris 和 Linux,并且可能适用于大多数支持/proc
文件系统的其他操作系统:
#!/bin/sh
cd /proc
echo " count pid"
ls -d [1-9]*/fd/* 2>/dev/null | sed 's/\/fd.*$//' | uniq -c | sort -rn
在 Linux 或其他操作系统下使用GNU-rg
代替。-rn
sort