如何关闭命名管道的写入端?

3

我希望能够同时追踪多个远程文件,并在同一时间内对这些文件的统计数据进行聚合。目前,我的方法如下:

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流传来了经过grep处理的日志的聚合。但是,我不确定如何打印最终总计数。我知道我需要关闭fifo的写入器,但我不确定如何做到这一点。有没有建议可以在不将整个流存储为文件的情况下完成这一点?


把后台进程的PID存储起来,等你准备好了再杀掉它们?祝你好运。 - shellter
每个远程主机上的tail -f进程都会无限循环并附加到fifo,因此必须将它们杀死。如果每个ssh被杀死,则应该发生这种情况。可以使用(在Mac OS X上)类似于killall -t yourtty ssh(运行tty以查找设备)或通过解析大多数系统上的ps | grep ssh来找到ssh进程ID。 - Kevin Grant
为什么不在调用tail时省略“-f”选项?你如何知道何时需要关闭写入器? - William Pursell
1个回答

2

终止FIFO写入者

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

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

请注意,fuser默认发送SIGKILL信号,因此给出的示例发送显式的SIGTERM信号,然后等待五秒钟才强制终止进程。这应该允许您的进程在自己清理之后运行,但请随意调整调用以适应您的需求。
此外,请注意我们传递了-w标志,以便fuser仅杀死具有写访问权限的进程。如果没有此标志,您也将杀死cat和awk。

我没有看到-w选项,但是即使没有-w选项,它仍然可以正常工作。 - jonderry
我发现发送 -PIPE 可以达到我想要的效果,而不会触发额外的输出。 - jozxyqk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接