tail -f no sigue archivos en WSL

tail -f no sigue archivos en WSL

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 -ffunciona como se esperaba.

Qué me estoy perdiendo ?

Respuesta1

El problema principal es que la inotifyAPI 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 taillas 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 inotifypara observar los cambios en el sistema de archivos (en este caso, por supuesto tail -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 exitosa tail -fpara 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 inotifysi 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 tailla 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, inotifyfunciona 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.

información relacionada