简洁版本:
除我将输出重定向到 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
已经将内容写入文件。
你能验证这个行为吗?