我需要监控大量 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
。