跟踪两个不同主机中的日志文件

跟踪两个不同主机中的日志文件

我正在尝试跟踪不同主机中的两个日志文件,并将合并的输出用作单个输出。

ssh HOST_1 "tail -f MY_LOG_FILE"

我还使用 mkfifo 创建命名管道。

mkfifo MY_PIPE

问题是。将本地命令输出到 MY_PIPE 工作正常,但是当我输出 ssh 命令时,在命名管道上无法读取任何内容(在另一个终端中使用 tail -f MY_NAMED_PIPE)

mkfifo MY_PIPE

ssh HOST_1 "tail -f MY_LOG_FILE" > MY_NAMED_PIPE

上述命令不会在管道上生成输出。

ssh 命令是否有任何参数可以正确地进行管道传输?

还有其他方法可以管道吗?

答案1

您还可以使用球座使用附加选项(-A)合并内容。

在 1 号航站楼

ssh HOST_1 "tail -f /path/to/file" | tee -a /path/to/merged/contents

在 2 号航站楼

ssh HOST_2 "tail -f /path/to/file" | tee -a /path/to/merged/contents

在 3 号航站楼

tail -f /path/to/merged/contents

答案2

ssh HOST_1 "tail -f MY_LOG_FILE" > MY_NAMED_PIPE

尾部程序将以 8 KB 左右的块缓冲其输出,因为它不写入 TTY。如果 MY_LOG_FILE 不是很活跃,这可能就是您看不到任何输出的原因。即使它工作正常,tail 也不会一次写入整行,因此多个 tail 实例的输出会严重混乱。

您可以ssh使用 TTY 运行 tail 命令。这应该会导致tail按行缓冲其输出。这应该会产生更好的结果。

ssh -tt HOST_1 "tail -f MY_LOG_FILE" > MY_NAMED_PIPE

您可以参考 ssh 手册页这里

答案3

我刚刚做了以下事情:

mkfifo MY_PIPE
ssh HOST_1 "tail -f /var/log/messages" > MY_PIPE

在本地机器上我运行:

tail -f /var/log/messages > MY_PIPE

在本地计算机上的另一个终端中:

cat < MY_PIPE

远程和本地命令的输出tail -f /var/log/messages都是可见的。

我遵循的教程来自Linux 杂志。

相关内容