我正在尝试跟踪不同主机中的两个日志文件,并将合并的输出用作单个输出。
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 杂志。