是否有类似 top 的命令显示正在运行的进程的网络带宽和文件访问

sil*_*tar 41 networking process process-management bandwidth files

例如,我们希望看到:

PROCESS       IF       TX       RX       FILE(regular) R/W
prog1         eth0     200kB/s  12kB/s   --            --
              wlan0    12kB/s   100kB/s  --            --
              --       --       --       file1         R
              --       --       --       file2         R
              --       --       --       file3         W
prog2         eth0     0kB/s    200kB/s  --            --
              --       --       --       file4         W
              --       --       --       file5         W
Run Code Online (Sandbox Code Playgroud)

这可能吗?nethogs 只显示 TX/RX,而 lsof 只显示文件访问。

我目前正在做一个像这样的两步过程:

sudo nethogs
sudo lsof -a -d 1-999 -c hogging_program /
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

小智 35

sysstat尝试iftop for network 和 pidstat 。

两者都可能是您选择的发行版的简单安装(apt-get 等)。

  • “iftop”的一个问题:确保使用“-i”选项向它传递了一个接口名称。人们会期望它默认监听所有接口——不幸的是,事实并非如此。相反,它会随机选择一个,因此,根据您的运气,您可能会得到无效的结果。 (3认同)

Flu*_*lup 6

atop以某种方式为您提供您想要的东西,尽管它不会像按文件句柄分解 I/O 那样具体。要获得完整的网络统计信息,您必须应用内核补丁。


aqu*_*unk 6

据我所知,没有。您正在尝试完成的工作是可以像您目前正在做的那样组合多个命令,尽管我不知道其他应用程序可以为您提供更易于解析的数据(编:另一个我不知道的答案建议 iftop 添加了一个管道式单行文本输出模式)。通过一些巧妙的 shell 脚本、管道数据和一些手动格式化,您至少可以接近您正在寻找的输出。

您搜索的内容同时显示网络和文件统计信息(由操作系统的两个不同部分提供)似乎与“UNIX 哲学”的某些租户背道而驰:

  • 让每个程序做好一件事。要完成一项新工作,请重新构建而不是通过添加新功能使旧程序复杂化。
  • 期望每个程序的输出成为另一个未知程序的输入。不要用无关信息混淆输出。

这在输出文本的程序中尤为明显,例如 lsof。您通常不会看到 *NIX 控制台程序提供的用户界面与要通过管道传输到另一个程序的数据一样多,也可能看不到脚本使用诸如cut 之类的 shell 命令来创建自己的专门定制的输出。

道格麦克罗伊几年后总结了他早先的声明:

编写只做一件事并把它做好的程序。编写程序以协同工作。编写程序来处理文本流,因为这是一个通用接口。

虽然它可能无法帮助您获得所需的格式化输出,但The Art of UNIX Programming是一本很好的读物,我在其中找到了这些引文的来源。

  • 这并没有提供问题的答案。 (15认同)
  • 我相信你想要完成的事情可能最好被描述为“回答问题”;不要给某人讲哲学。 (3认同)

小智 5

iptraf非常有用,可以查找带宽占用情况。

  • 添加更多信息/解释将使您的答案更好。 (5认同)