我通过 mono 运行几个不同的服务,每个服务都在自己的端口上,但是当我使用 netstat 检查哪些服务已分配端口、哪些服务没有分配端口时,我得到的只是两个名为“mono”的进程,除了查看端口(有时会发生变化)之外,没有办法分辨哪个是哪个。
是否可以让 netstat 显示每个端口的“命令”,就像 htop 对进程所做的那样?
这样我就能分辨出哪个过程是哪个。
答案1
这需要做一些工作,但我设法创建了一个过滤器来附加程序的参数列表:
netstat -p | while l="$(line)";\
do p="$(sed -En 's/^.*( [0-9]+)\/[^ ]*.*/\1/gp'<<<"$l")";\
[ "$p" == "" ] || p=" ## $(ps -p $p -o cmd=)";\
echo "$l"$p;\
done
笔记:
- 显然您不会每次都输入这些内容:将过滤器代码放入函数或脚本中(在这种情况下,尾随
;\
字符串是不必要的)。 - 由于
netstat
写入管道时需要缓冲,因此过滤器开始处理行之前会有延迟。 exec
出于同样的原因,在netstat
输出该行和ps
检索 PID 的参数之间,程序可能会终止或发生其他情况。- 如果在运行程序时未指定程序路径,则不会显示程序路径,因为它
ps
显示arg0
自程序的运行字符串。 - 并非所有系统都有该
line
命令:如果您while l=($line)
用更常见的替换while read -r l
,这将修剪前导和尾随空格;当您需要保留它们时,您可以使用while read -r
,用$REPLY
替换$l
(或者while read -r; do l="$REPLY"; ...
为了完全等效,用$l
不变 )。 - 该过滤器的工作原理是读取一行
netstat
,用于sed
从任何中提取PID数字/细绳序列,然后使用ps -p
此 PID 来查找命令参数。 - 最后
echo "$l"$p
,$p
位于引号外面:这是为了删除尾随空格(这也是wine
程序的一个问题),但它会产生将参数中的多个空格压缩为一个空格的副作用。