tail -f 没有尾巴?

tail -f 没有尾巴?

Solaris 中是否有命令可以读取文件,并且当文件到达末尾时,按照 tail 的方式进行流式传输?我需要从头开始读取文件,它是一个二进制文件。

如果您能提供有关 Solaris 和 Linux 的信息,我们将非常感激。

答案1

tail -9999f会做一些接近你想要的事情。如果你的文件更大,请添加更多 9。

问题:

  1. 二进制文件可能没有换行符。 tail -f将等待换行符后再打印任何内容。
  2. Solaris 上的版本tail(你没有提到哪个Solaris(但这可能无关紧要)可能不支持该选项。它可能支持tail -n 9999 -f。您可能必须获取 tail 的 GNU 版本。
  3. 由于文件不断增大,因此在确定文件大小和启动尾部进程之间存在竞争条件。如果您没有要求它获取足够的行,您可能会错过文件的开头。
  4. tail不知道您何时真正完成了对文件的写入,因此您的gzip进程也永远不会完成。我不确定当您ctrl-c结束tail进程时会发生什么,但很可能 gzip 会在完成后自行清理并删除它正在处理的文件。

我的建议是启动原始程序并将输出通过管道传输到 gzip,如下所示:

./my_program | gunzip > new_file.txt

这样,如果my_program速度很慢,gunzip 将会等待,但是当文件真正结束时,my_program完成指示,它仍然会完成。

您可能需要重写程序以写入 STDOUT 而不是直接写入文件。

编辑:

看了手册页,上述三个问题都可以解决。使用选项-c <bytes>代替可以-n <lines>缓解问题 1。使用-n +0-c +0可以缓解问题 3。使用--pid=<PID>将使 tail 在原始程序(以 运行<PID>)终止时终止,从而缓解问题 4。

答案2

在 Linux 中,您可以使用tail -f -n +0 /path/filename它来查看它。虽然 -n 通常是指要打印文件末尾的行数,但传递时+<n>它会从文件开头的第 n 行开始。

tail --help

-n, --lines=K            output the last K lines, instead of the last 10;
                         or use -n +K to output lines starting with the Kth

相关内容