netstat 具有完整的命令名称(如 htop 中)

Min*_*int 5 netstat

我通过 mono 运行几个不同的服务,每个服务都有自己的端口,但是当我使用 netstat 检查哪些已分配端口而哪些没有分配时,我得到的只是 2 个名为“mono”的进程,无法分辨除了查看端口之外,有时可能会发生变化。

是否可以让 netstat 显示每个端口的“命令”,就像 htop 对进程所做的那样?

这样我就可以分辨出哪个进程是哪个进程。

AFH*_*AFH 3

这需要一些工作,但我已经成功创建了一个过滤器来附加程序的参数列表:

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
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 显然,您不会每次都键入此内容:将过滤器代码放入函数或脚本中(在这种情况下,;\不需要尾随字符串)。
  • 由于netstat写入管道时会进行缓冲,因此过滤器开始处理行之前会出现延迟。
  • 出于同样的原因,程序可能会终止,或者在输出行和检索 PID 参数exec之间发生其他情况。netstatps
  • 如果程序运行时未指定,则不会显示程序路径,因为从程序的运行字符串中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 ,然后使用该 PID 来查找命令参数。ps -p
  • 最后的echo "$l"$p$p位于引号之外:这是为了删除尾随空格(也是wine程序的问题),但它会产生将参数中的多个空格压缩为单个空格的副作用。