如何关闭命名管道的编写器?

时间:2012-06-28 02:56:16

标签: bash unix pipe

我有兴趣同时关注多个远程文件,并同时在文件上汇总统计信息。到目前为止,我按照以下方式执行此操作:

mkfifo mfifo
ssh -ft host1 'tail -f /path/to/log | grep something' > mfifo &
ssh -ft host2 'tail -f /path/to/log | grep something' > mfifo &
ssh -ft host3 'tail -f /path/to/log | grep something' > mfifo &
cat mfifo | awk '{x += $4; print $3} END {printf "total: %d", x}'

这几乎按预期工作,通过awk流式传输的grepped日志聚合。但是,我不确定如何打印最终总数。我认为我需要关闭fifo的作者,但我不确定如何做到这一点。有关如何在不将整个流存储为文件的情况下提出任何建议吗?

1 个答案:

答案 0 :(得分:2)

杀死FIFO编写器

您可以使用 fuser 来终止写入文件的进程。例如:

fuser -TERM -k -w mfifo; sleep 5; fuser -k -w mfifo

请注意,fuser默认发送SIGKILL,因此给出的示例发送一个显式SIGTERM,然后在强制终止进程之前等待五秒钟。这应该允许您的进程自行清理,但可以随意调整调用以适应。

另外,请注意我们正在传递-w标志,因此fuser只会使具有写访问权限的进程死亡。如果没有此标志,您还将杀死 cat awk