Ich habe :
F:\xampp-htdocs>wsl --list
Windows Subsystem für Linux-Distributionen:
Ubuntu-22.04 (Standard)
Ich gehe unter Windows 11 per CD in meine Protokolldateien:
/mnt/d/xampp-2024-15-01/apache/logs$
da tue ich
tail -f access.log
Tail gibt nur die letzten Zeilen aus, folgt dann aber nicht mehr der Datei. Habe dies mit verschiedenen Dateien innerhalb von WSL und Windows11 versucht. Kein Erfolg,
Funktioniert auf einem entfernten, externen echten Ubuntu-System „20.04.6 LTS (Focal Fossa)“ tail -f
wie erwartet.
Was vermisse ich ?
Antwort1
Das Hauptproblem besteht darin, dass die inotify
API vom Netzwerkdateisystem Plan 9 (9P) nicht unterstützt wird, das von WSL2 für den Zugriff auf Windows-Laufwerke verwendet wird. Dies wirkt sich auf Dinge wie tail
„Hot Reload“-Funktionen in vielen Entwicklungstools aus (z. B. npm watch
).
Dies tritt in WSL2 auf, wenn:
- Eine Linux-App versucht, mit
inotify
nach Dateisystemänderungen zu suchen (in diesem Fall natürlichtail -f
) - Die Datei befindet sich auf einem Windows-Laufwerk (wie Sie sagten,
/mnt/d
) - (Ich bin ziemlich sicher) Ein Windows-Prozess schreibt in die Datei. Wenn ich die Datei mit einem Linux-Prozess in WSL2 vergrößere (z. B. ), führt dies bei mir
echo foo >> file_name
zu einem erfolgreichen Update .tail -f
Normale Problemumgehungen:
Speichern Sie Ihre Datei möglichst im Linux-Dateisystem. Manchmal ist das möglich, manchmal nicht.
Verwenden Sie Polling anstelle von
inotify
, wenn die App dies unterstützt. In diesem Fall, wie in einem derSO antwortetdarauf hat @KamilMaciorowski Sie in den Kommentaren hingewiesen, das ist erledigttail -f ---disable-inotify <file>
, aber Sie haben geantwortet, dass keine der Antworten für Sie funktioniert hat.Daskönntekann an einer anderen Version als der in der Antwort verwendeten liegen
tail
. Sie können auch versuchen, ein Wiederholungsintervall hinzuzufügen:tail -f ---disable-inotify -s 1 <filename>
Ein „traditioneller“ Vorschlag in der Vergangenheit war, WSL1 zu verwenden, wenn es für Ihren Anwendungsfall geeignet ist. Da WSL1 jedoch seit einigen Jahren kein Update mehr erhalten hat, wird es immer schwieriger, seine Verwendung zu rechtfertigen. Dennoch bleibt es eine Option.
inotify
Funktioniert unter WSL1 auf Windows-Laufwerken.Sie können das Problem folgendermaßen
tail
umgehen:pwsh.exe -c 'Get-Content <windows_path_to_file> -wait'
Anmerkungen:
Wenn Sie PowerShell Core nicht installiert haben, installieren Sie es (empfohlen) oder verwenden Sie alternativ
powershell.exe
.Wie bereits erwähnt, verwenden Sie, da Sie PowerShell innerhalb von WSL verwenden, dieWindowsPfad zur Datei. Z. B.
D:\xampp-2024-15-01\apache\logs$
.Beim Verschachteln von Shells kann das Setzen von Anführungszeichen/Escapezeichen eine Herausforderung darstellen.
Gutschrift andiese SO-Antwortfür die
-Wait
.Sie können dies natürlich in eine Shell-Funktion oder ein Shell-Skript einbinden oder einen Alias dafür verwenden.