我有 :
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
核心问题是inotify
WSL2 用于访问 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 函数或脚本中。