【问题标题】:How to close the writers of a named pipe?如何关闭命名管道的作者?
【发布时间】:2012-06-28 02:56:16
【问题描述】:

我有兴趣同时关注多个远程文件并同时汇总文件的统计信息。到目前为止,我这样做如下:

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 的作者,但我不知道该怎么做。关于如何在不将整个流存储为文件的情况下执行此操作的任何建议?

【问题讨论】:

  • 存储后台进程的 PID,然后在准备好时终止它们?祝你好运。
  • 每个远程主机上的tail -f 进程永远循环并附加到fifo,因此必须将它们杀死。如果每个ssh 都被杀死,这应该会发生。 ssh 进程 ID 可以通过(在 Mac OS X 上)killall -t yourtty ssh(运行 tty 以查找设备)或在大多数系统上解析 ps | grep ssh 来找到。
  • 为什么不在tail的调用中省略-f?你怎么知道你想什么时候关闭作家?

标签: bash unix pipe


【解决方案1】:

杀死 FIFO 写入器

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

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

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

另外,请注意我们传递了 -w 标志,因此 fuser 只会终止具有写访问权限的进程。没有这个标志,你也会杀死 cat 和 awk。

【讨论】:

  • 我没有看到 -w 选项,但如果没有 -w 选项,它仍然对我有用。
  • 我发现发送 -PIPE 做了我想做的事,而没有触发额外的输出。
猜你喜欢
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
相关资源
最近更新 更多