tail -f не отслеживает файлы на WSL

tail -f не отслеживает файлы на WSL

У меня есть :

F:\xampp-htdocs>wsl --list
Windows Subsystem für Linux-Distributionen:
Ubuntu-22.04 (Standard)

Я захожу в свои файлы журналов в Windows 11:

/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

Основная проблема заключается в том, что inotifyAPI не поддерживается сетевой файловой системой Plan 9 (9P), используемой WSL2 для доступа к дискам Windows. Это влияет на такие вещи, как tailфункции «горячей перезагрузки» во многих инструментах разработки (например, npm watch).

Это происходит в WSL2, когда:

  • Приложение Linux пытается использовать inotifyдля отслеживания изменений файловой системы (в данном случае, конечно, tail -f)
  • Файл находится на диске Windows (как вы сказали, /mnt/d)
  • (Я почти уверен) Процесс Windows записывает в файл. При увеличении файла с помощью процесса Linux в WSL2 (например, ) для меня 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.

    • Как уже отмечалось, поскольку вы используете PowerShell изнутри WSL, вы будете использоватьОкнапуть к файлу. Например, D:\xampp-2024-15-01\apache\logs$.

    • При вложенных оболочках кавычки/экранирование могут стать проблемой.

    • Кредит дляэтот ТАК ответдля -Wait.

    • Конечно, вы можете создать псевдоним или обернуть его в функцию оболочки или скрипт.

Связанный контент