我编写了一个基于 lsof 的脚本来监视特定应用程序的每个进程使用的套接字(每个进程一个套接字)。当我指定 -i 选项将打开的文件列表限制为套接字时,某些进程会丢失。
令 pid_list 为常量且格式正确的逗号分隔列表,包含 136 个进程。为什么结果有时小于136?
$ lsof -p $pid_list -a -i -nP -FpcnT | grep ^p | wc -l
135
$ lsof -p $pid_list -a -i -nP -FpcnT | grep ^p | wc -l
134
$ lsof -p $pid_list -a -i -nP -FpcnT | grep ^p | wc -l
136
只需 1 个 pid 即可重现该问题。
$ clear ; lsof -p 5404 -a -i -nP -FpcnT
p5404
cprocess
nsource:port->dest:port
TST=ESTABLISHED
TQR=0
TQS=0
$ clear ; lsof -p 5404 -a -i -nP -FpcnT
### OOPS!!!
$ clear ; lsof -p 5404 -a -i -nP -FpcnT
p5404
cprocess
nsource:port->dest:port
TST=ESTABLISHED
TQR=0
TQS=0
进程不间断地运行。每个进程都有一个处于 LISTEN 或 ESTABLISHED 状态的套接字。套接字是 IPv4。这是在带有 lsof 4.78 的 RHEL 5.11 上。
省略 lsof 选项-i
将始终输出正确的进程数。但该输出无法用于我的目的,因为我需要所有进程的 IP 和端口号。
lsof 忽略的进程似乎是随机的。他们从来都不相同。
我怀疑 lsof 对某些东西敏感,但是什么?
编辑2016-07-26
我尝试使用 netstat 作为解决方法,但遇到了同样的问题。该问题可能特定于我的应用程序,或者是我的应用程序的功能和操作系统限制的某种组合。有些东西阻止 lsof/netstat 正确报告。
答案1
尝试使用 sudo 权限。如果未使用 sudo 权限执行命令,某些进程将不会显示。