我有 :
F:\xampp-htdocs>wsl --list
Windows Subsystem für Linux-Distributionen:
Ubuntu-22.04 (Standard)
我在 Window 11 上 cd 進入我的日誌檔案:
/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
如果應用程式支持,請使用輪詢代替。在這種情況下,如其中之一所以答案@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 函數或腳本中。