Tengo :
F:\xampp-htdocs>wsl --list
Windows Subsystem für Linux-Distributionen:
Ubuntu-22.04 (Standard)
Ingresé a mis archivos de registro en Windows 11:
/mnt/d/xampp-2024-15-01/apache/logs$
ahí lo hago
tail -f access.log
Tail simplemente genera las últimas líneas pero luego ya no sigue el archivo. Probé esto con diferentes archivos dentro de WSL y Windows11. sin suerte,
En un sistema Ubuntu real remoto y externo "20.04.6 LTS (Focal Fossa)", tail -f
funciona como se esperaba.
Qué me estoy perdiendo ?
Respuesta1
El problema principal es que la inotify
API no es compatible con el sistema de archivos de red Plan 9 (9P) utilizado por WSL2 para acceder a las unidades de Windows. Esto afecta cosas como tail
las funciones de "recarga en caliente" en muchas herramientas de desarrollo (por ejemplo, npm watch
).
Esto ocurre en WSL2 cuando:
- Se intenta utilizar una aplicación de Linux
inotify
para observar los cambios en el sistema de archivos (en este caso, por supuestotail -f
) - El archivo está ubicado en una unidad de Windows (como dijiste
/mnt/d
) - (Estoy bastante seguro) Un proceso de Windows está escribiendo en el archivo. Al hacer crecer el archivo con un proceso de Linux en WSL2 (por ejemplo
echo foo >> file_name
), se obtiene una actualización exitosatail -f
para mí.
Soluciones normales:
Si es posible, almacene su archivo en el sistema de archivos de Linux. A veces esto es posible, otras no.
Utilice encuestas en lugar de
inotify
si la aplicación las admite. En este caso, como en uno de losAsí que respondeque @KamilMaciorowski te señaló en los comentarios, ya estátail -f ---disable-inotify <file>
, pero respondiste que ninguna de las respuestas funcionó para ti.Estepodríadeberse a una versión diferente de
tail
la respuesta utilizada. También puedes intentar agregar un intervalo de reintento:tail -f ---disable-inotify -s 1 <filename>
Una sugerencia "tradicional" en el pasado ha sido utilizar WSL1 si funciona para su caso de uso. Sin embargo, dado que WSL1 no ha recibido una actualización en algunos años, cada vez es más difícil justificar su uso. Aun así, sigue siendo una opción. Bajo WSL1,
inotify
funciona en unidades de Windows.Específicamente
tail
, puedes hacer una solución alternativa:pwsh.exe -c 'Get-Content <windows_path_to_file> -wait'
Notas:
Si no tiene PowerShell Core instalado, instálelo (recomendado) o, alternativamente, use
powershell.exe
.Como se señaló, dado que está utilizando PowerShell desde dentro de WSL, utilizará elventanasruta al archivo. P.ej,
D:\xampp-2024-15-01\apache\logs$
.Citar/escapar puede ser un desafío al anidar shells.
Crédito aesta respuesta SOPara el
-Wait
.Por supuesto, puede asignar un alias o envolver esto en una función o script de shell.