netstat 问题:无法将“netstat -c”的输出通过管道传输到 nfs 挂载点

netstat 问题:无法将“netstat -c”的输出通过管道传输到 nfs 挂载点

简洁版本:

除我将输出重定向到 NFS 中的文件外,Netstat 工作正常。

不起作用:netstat -c > /nfs/mount/file

作品:netstat > /nfs/mount/file

作品:netstat -c

作品:netstat -c > /tmp/file

症状:空文件,没有错误消息。

这是在 Ubuntu 10.10 上使用 bash

详细版本:我正在开展一个项目,该项目要求我们在测试执行期间从小型集群(约 32 个节点)上的所有节点收集 iostat 和 netstat 统计信息。我们编写了脚本,在每个节点上使用适当的标志启动 iostat 和 netstat 实例,每个进程都写入存储在 NFS 共享上的目录中的文件(每个文件名都包含写入它的主机名)。

iostat 脚本运行良好,但我们发现 netstat 脚本存在问题。

出于某种原因,如果我使用 -c 标志启动 netstat 进程,表示每秒连续输出一次,并将其通过管道传输到 NFS 目录中的文件,则会创建一个空文件并且不会向其中写入任何输出。

如果我在提供 NFS 存储的服务器上执行相同的操作,写入同一目录(在本例中,除了它是本地存储之外),那么一切都会顺利进行。此外,如果我写入有问题的主机上的本地文件系统(如 /tmp/foo.txt),那么一切都会顺利进行。

还值得注意的是,如果我只是运行“netstat”,不带 -c 标志,并将其传送到存储在 NFS 上的文件,那么它也能起作用。

因此,netstat 的连续输出标志似乎有点问题,它与 NFS 交互的方式与其他工具的连续输出不同(例如 iostat 的“-t 10”标志)。

此设置中的所有主机均运行 ubuntu 10.10。

答案1

那这个呢?

script -f -c "netstat -c" /nfs/mount/file > /dev/null

我认为它可能会起作用,尽管我手边没有 NFS 服务器来测试它。

答案2

strace 显示我的 netstat -c 在输出结果之前花费了大量时间来解析主机名 - 也许应该尝试netstat -nc > /nfs/foo或等待更长时间再将其终止。我认为这与 NFS 无关 - 当我重定向到/tmp/foo

答案3

对于特定的 NFS 配置,同步延迟可能会非常大,并且似乎netstat在之后没有刷新其输出SIGKILL

大约 15 秒后终止进程会导致文件为空,正如您所描述的那样。我等了很长时间(我去喝咖啡了),当我回来时,netstat已经将内容写入文件。

你能验证这个行为吗?

相关内容