`tail -f` 有时会停止更新 - 但文件并没有移动

`tail -f` 有时会停止更新 - 但文件并没有移动

我最近注意到有时tail -f <logfile>会停止屏幕更新。

不过,执行Ctrl>-C并重新启动tail可以正常工作。我检查以确保日志文件没有在中途旋转(这可能会让它tail失去理智)。

什么原因造成这种情况?我正在运行 RHEL 5.2 x64。

答案1

strace如果有的话,尝试用以下方式包装你的 tail 命令:

strace -Tt -o /tmp/tail.trace tail -f /var/log/messages

然后只是为了疯狂的递归刺激,你可以跟踪 strace 的输出(如果它中断了也没关系,因为它会输出到一个文件中):

 tail -f /tmp/tail.trace

我的样子如下:

8:39:00 write(1, "ng SMAC\n", 8)       = 8 <0.000026>
18:39:00 read(3, "", 0)                 = 0 <0.000019>
18:39:00 fstat64(3, {st_mode=S_IFREG|0640, st_size=92990, ...}) = 0 <0.000019>
18:39:00 fstatfs64(3, 84, {f_type="EXT2_SUPER_MAGIC", f_bsize=4096, f_blocks=4807069, f_bfree=1924458, f_bavail=1680271, f_files=1221600, f_ffree=820806, f_fsid={-1331083162, -1313908385}, f_namelen=255, f_frsize=4096}) = 0 <0.000021>
18:39:00 inotify_init()                 = 4 <0.000033>
18:39:00 inotify_add_watch(4, "/var/log/messages", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1 <0.000041>
18:39:00 fstat64(3, {st_mode=S_IFREG|0640, st_size=92990, ...}) = 0 <0.000019>
18:39:00 read(4,

-t 切换时间,-T 切换通话所花费的时间。

按 4 或 5 次回车键,留出一点垂直空间,然后等待它停止拖尾。希望输出中能有一些线索。

答案2

尝试使用:

tail --follow=name <logfile>

看看效果是否更好。你不必担心它会从你身下旋转出来。


停止有什么规律吗?一段时间?一天中的某个时间?

答案3

鉴于两个有问题的日志文件都是由同一应用程序的不同组件编写的,我想知道问题是否出在该应用程序的日志记录代码中。我建议进行两项测试以更好地了解发生了什么:

  • 在启动 tail 之前,记下日志文件的 inode ( ls -i logfile),一旦 tail 失败,请再次检查。如果 inode 已更改,则记录器正在重写整个日志文件,这会中断 tail 的连接。

  • 注意 tail 停止工作之前的最后一行,然后访问文件并找到该行之后的第一个日志条目。如果可能,请重复此操作 3-5 次。如果是执行日志记录的程序的问题,则在您看到 tail break 之后立即写入日志条目的程序部分最有可能是问题所在。如果该日志条目始终相同,或者它来自程序的同一组件,则您可能有足够的数据向应用程序供应商提交问题报告。

祝你好运。

答案4

这里遇到了同样的问题。

问题是,我正在查看的文件是从另一台机器安装的。更改通知未通过安装传播。

解决方案是在原始机器上使用尾部。

相关内容