带有完整命令名的 netstat(类似于 htop)

带有完整命令名的 netstat(类似于 htop)

我通过 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程序的一个问题),但它会产生将参数中的多个空格压缩为一个空格的副作用。

相关内容