如何“尾随”多个管道文件或流?

如何“尾随”多个管道文件或流?

我需要监控大量 Web 服务器的运行时错误,我想运行如下脚本

/bin/bash -e #!/bin/bash -e

# 主机示例
主机=(
主机1
主机2

对于 ${HOSTS[@]} 中的主机
        [[ !-e ${主机}.pipe ]] && mkfifo ${主机}.pipe
        (ssh -n $host “tail -n0 -F /tmp/test” >> ${host}.pipe)&
完毕

尾部-F-c +0 *.pipe

并且它应该会给我这样的输出:

==> host1.pipe <==
event 1
event 2

==> host2.pipe <==
event 3
event 4

==> host1.pipe <==
event 5

你明白了。我看到了日志行,它们的来源很明显,因为tail -F你通常在运行多个文件时会显示它们。

Tail 选项-c +0据称可以让它从第 0 个字节开始打印流内容。

但这不起作用!我看到的是

==> host1.pipe <==
event 1
event 2
event 5

也就是说,除了第一个流之外,没有显示任何其他流。

这是上述脚本的更简单的变体,仍然重现了该问题:

tail -F -c +0 \
        <(ssh host1 "tail -n1 -F /tmp/test") \
        <(ssh host2 "tail -n1 -F /tmp/test") \
        ;

更简单,仍然重现该问题:

tail -F -c +0 \
    <(while true; do date;     sleep 1; done) \
    <(while true; do date +%s; sleep 1; done)

我正在使用 coreutils 8.27 和 Linux 内核 4.9.14 的 tail。

提前感谢任何提示!

请注意,我不喜欢有人建议我使用“多尾”。我试过了,分屏功能无法扩展到我们现在拥有的数十台服务器。

答案1

请注意,我不喜欢被建议使用multitail。我试过了,窗格中的分屏无法扩展到我们现在拥有的数十台服务器。

选项怎么样-L?它不分屏。

multitail \
  --mark-change \
  -L "while sleep 1; do date;     done" \
  -L "while sleep 5; do date +%s; done" \
  -L "while sleep 7; do date +%Y; done"

如果您想使用命名管道,则应使用-I而不是-L。不幸的是,multitail它要求-I每个文件都分开,这使得通配符 ( *) 方法更加困难。不幸的是,它的-Iw选项似乎不适用于命名管道;我无法让该工具与之配合xargs(至少在我的 Debian 上)。

还是有办法的:

multitail --mark-change --mergeall *.pipe

输出将与您预期的非常相似tail

相关内容