这篇文章上次修改于 616 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

tail根据文件名监视输: tail -F。

应用中,常常会使用 tail 命令监视日志文件输出情况。但日志文件往往为了限制大小,需要在达到一定大小或到一定时刻进行重命名等操作,重新输出日志到新的文件中。这时,如果仍使用 tail -f 将不能监视到输出到新文件中的日志。
其实,GUN tail是支持根据文件名追踪文件内容更新的,这在工具的帮助信息已经提示说明了,只不过默认是根据文件打开后的描述符而已。

$ tail --help
用法:tail [选项]... [文件]...
显示每个指定文件的最后 10 行并输出至标准输出。
若指定了多于一个文件,程序会在每段输出的开始添加相应文件名作为头。

如果没有指定文件,或者文件为"-",则从标准输入读取。

必选参数对长短选项同时适用。
  -c, --bytes=[+]NUM       输出最后 NUM 字节;或者使用 -c +NUM 以输出
                             每个文件第 NUM 个字节之后的全部内容
  -f, --follow[={name|descriptor}]
                           随文件增长即时输出新增数据;
                             若未给定选项参数,则默认使用 'descriptor'
  -F                       和 --follow=name --retry 相同
  -n, --lines=[+]NUM       output the last NUM lines, instead of the last 10;
                             or use -n +NUM to output starting with line NUM
      --max-unchanged-stats=N
                           with --follow=name, reopen a FILE which has not
                             changed size after N (default 5) iterations
                             to see if it has been unlinked or renamed
                             (this is the usual case of rotated log files);
                             with inotify, this option is rarely useful
      --pid=PID            同 -f 一起使用,当所指定<PID>对应的进程死去后终止
  -q, --quiet, --silent    不输出给出文件名的头
      --retry              即使目标文件不可访问依然重复试图打开
  -s, --sleep-interval=N   with -f, sleep for approximately N seconds
                             (default 1.0) between iterations;
                             with inotify and --pid=P, check process P at
                             least once every N seconds
  -v, --verbose            always output headers giving file names
  -z, --zero-terminated    以 NUL 字符而非换行符作为行尾分隔符
      --help            显示此帮助信息并退出
      --version         显示版本信息并退出

NUM may have a multiplier suffix:
b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
Binary prefixes can be used, too: KiB=K, MiB=M, and so on.

如果您希望即时追查一个文件的有效名称而非描述内容(例如循环日志),默认
的程序动作并不如您所愿。在这种场合可以使用--follow=name 选项,它会使
tail 定期追踪打开给定名称的文件,以确认它是否被删除或被其它某些程序重新创建过。

故只需使用 -F 替换掉 -f 即可,这样当日志 xxx.log 达到了设定条件重命名为 xxx.log.1 时,-f 选项追踪的还是 xxx.log.1 文件而不是新创建的 xxx.log 文件,这时就不能继续监控最新日志了;而 -F 是根据文件名而非描述符方式。

  • tail -f
等同于–follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止
  • tail -F
等同于–follow=name --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪