tail -f 不跟踪 WSL 上的文件

tail -f 不跟踪 WSL 上的文件

我有 :

F:\xampp-htdocs>wsl --list
Windows Subsystem für Linux-Distributionen:
Ubuntu-22.04 (Standard)

我使用 cd 命令进入 Windows 11 上的日志文件:

/mnt/d/xampp-2024-15-01/apache/logs$

是的,我明白

tail -f access.log

Tail 只输出最后几行,但不再跟踪文件。在 WSL 和 Windows11 中尝试了不同的文件。没有成功,

在远程、外部的真实 Ubuntu“20.04.6 LTS(Focal Fossa)”系统上,tail -f可按预期工作。

我错过了什么?

答案1

核心问题是inotifyWSL2 用于访问 Windows 驱动器的 Plan 9 (9P) 网络文件系统不支持该 API。这会影响tail许多开发工具(例如npm watch)中的“热重载”功能。

在 WSL2 中,当发生以下情况时会出现这种情况:

  • Linux 应用程序正在尝试使用来inotify监视文件系统更改(在这种情况下,当然是tail -f
  • 该文件位于 Windows 驱动器上(正如您所说,/mnt/d
  • (我相当确定)Windows 进程正在写入文件。当使用 WSL2 中的 Linux 进程扩展文件时(例如),对我来说echo foo >> file_name会成功更新。tail -f

常规解决方法:

  • 如果可能的话,将文件存储在 Linux 文件系统上。有时这是可能的,有时则不可能。

  • inotify如果应用支持,请使用轮询代替。在这种情况下,就像在SO答案@KamilMaciorowski 在评论中向您指出,这已经完成了tail -f ---disable-inotify <file>,但您回答说没有一个答案适合您。

    可以可能是由于使用的答案版本不同tail。您也可以尝试添加重试间隔:

    tail -f ---disable-inotify -s 1 <filename>
    
  • 过去的“传统”建议是,如果 WSL1 适合您的用例,则使用它。但是,由于 WSL1 几年来都没有收到更新,因此越来越难以证明其用途。不过,它仍然是一个选择。在 WSL1 下,inotify可在 Windows 驱动器上运行。

  • 具体来说tail,你可以做一些奇怪的解决方法:

    pwsh.exe -c 'Get-Content <windows_path_to_file> -wait'
    

    笔记:

    • 如果您尚未安装 PowerShell Core,请(推荐)安装它,或者使用powershell.exe

    • 如上所述,由于您在 WSL 内部使用 PowerShell,因此您将使用视窗文件的路径。例如,D:\xampp-2024-15-01\apache\logs$

    • 嵌套 shell 时,引用/转义可能是一个挑战。

    • 归功于这个答案为了-Wait

    • 当然,您可以将其作为别名或包装在 shell 函数或脚本中。

相关内容