tail -f 不追蹤 WSL 上的文件

tail -f 不追蹤 WSL 上的文件

我有 :

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

核心問題是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如果應用程式支持,請使用輪詢代替。在這種情況下,如其中之一所以答案@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 函數或腳本中。

相關內容