监视整个目录(甚至是新目录)中的文件(à la tail -f)

san*_*zky 62 logs tail

我通常会在一个目录中观察许多日志做tail -f directory/*. 问题是之后创建了一个新日志,它不会显示在屏幕上(因为*已经展开了)。

有没有办法监视目录中的每个文件,即使是在进程启动后创建的文件?

Gil*_*il' 57

您可以使用... multitail拖尾 多个文件。

multitail -Q 1 'directory/*'
Run Code Online (Sandbox Code Playgroud)

-Q 1 PATTERN表示每 1 秒检查一次与PATTERN匹配的现有文件或新文件中的新内容。来自所有文件的行显示在同一窗口中,使用-q而不是-Q具有单独的窗口。

  • 看起来这个不再维护了 (2认同)

小智 13

xtail也是一种选择。它的手册页将其描述为:

Xtail 监视一个或多个文件,并显示自命令调用以来写入文件的所有数据。它对于同时监视多个日志文件非常有用。如果命令行上给出的条目是目录,则该目录中的所有文件都将受到监视,包括在调用 xtail 之后创建的文件。如果命令行上给出的条目不存在,xtail 将监视它并在创建后监视它。在显示中切换文件时,会打印显示文件路径名的横幅。

一个中断字符(通常是 CTRL/C 或 DEL)将显示正在观看的最近修改过的文件的列表。发送退出信号(通常是 CTRL/反斜杠)来停止 xtail。


小智 9

您也可以使用以下方式观看目录watch

watch -n0,1 "ls -lrt /directory/ | tail"
Run Code Online (Sandbox Code Playgroud)

  • 这并没有给出原始问题的解决方案。这只是输出(最后几行)目录列表(反复地,始终是最新的 - 感谢“watch”),而不是该目录中所有文件(包括新文件)的最新行。 (3认同)

sr_*_*sr_ 8

不知道 shell 解决方案,但是(假设 Linux 1inotify可能是要走的路......请参阅这个模仿tail -F(使用pyinotify)的示例,也许它可以用作跟踪整个目录的基础。

一般情况下,inotify可以监控目录(引用man 7 inotify

调用 inotify_add_watch(2) 时可以在掩码中指定以下位,并且可以在 read(2) 返回的掩码字段中返回以下位:

IN_ACCESS         File was accessed (read) (*).
IN_ATTRIB         Metadata changed, e.g., permissions, timestamps,
                    extended attributes, link count (since Linux 2.6.25),
                    UID, GID, etc. (*).
IN_CLOSE_WRITE    File opened for writing was closed (*).
IN_CLOSE_NOWRITE  File not opened for writing was closed (*).
IN_CREATE         File/directory created in watched directory (*).
IN_DELETE         File/directory deleted from watched directory (*).
IN_DELETE_SELF    Watched file/directory was itself deleted.
IN_MODIFY         File was modified (*).
IN_MOVE_SELF      Watched file/directory was itself moved.
IN_MOVED_FROM     File moved out of watched directory (*).
IN_MOVED_TO       File moved into watched directory (*).
IN_OPEN           File was opened (*).
Run Code Online (Sandbox Code Playgroud)

监视的目录中,标有上述可发生在目录中的文件的星号(*),这些事件在该情况下,在目录中的文件的返回inotify_event结构标识的名称的名称字段。

(...并pyinotify密切关注这些选项)

1: BSD 也有类似的东西,kqueue. 也许一个跨平台解决方案是可以实现使用GIO(Python绑定)作为抽象层,因为它可以,旁边inotify也可以使用kqueue