tail -f 没有尾巴?

700*_*are 5 linux solaris tail streaming cat

Solaris 中是否有读取文件的命令,当它结束时以tail 的方式流式传输?我需要从头读取文件,它是一个二进制文件。

有关 Solaris 和 Linux 的信息将不胜感激。

Gea*_*Lin 12

在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
Run Code Online (Sandbox Code Playgroud)


Lad*_*ada 5

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

问题:

  1. 二进制文件可能没有换行符。 tail -f将在打印任何内容之前等待换行符。
  2. 的版本tail在Solaris(你没有提到的Solaris,但它可能并不重要)可能不支持该选项。它可能支持tail -n 9999 -f. 您可能需要获得 GNU 版本的 tail。
  3. 因为文件在不断增长,所以在找出它有多大和开始尾进程之间存在竞争条件。如果您不要求它获得足够的行,您可能会错过文件的开头。
  4. tail不知道您何时真正完成了对文件的写入,因此您的gzip过程也永远不会完成。我不确定当您ctrl-c结束该tail过程时会发生什么,但 gzip 很可能会自行清理并删除它正在处理的文件。

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

./my_program | gunzip > new_file.txt
Run Code Online (Sandbox Code Playgroud)

那样的话,gunzip 会my_program在速度变慢时等待,但当文件的真正结束由my_program完成指示时仍然会完成。

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

编辑:

查看手册页后,可以解决上述三个问题。使用-c <bytes>选项而不是-n <lines>缓解问题 1. 使用-n +0-c +0缓解问题 3.--pid=<PID>当原始程序(运行方式<PID>)终止时,使用将使尾部终止,从而缓解问题 4。