У меня есть :
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
Основная проблема заключается в том, что inotify
API не поддерживается сетевой файловой системой 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
.Конечно, вы можете создать псевдоним или обернуть его в функцию оболочки или скрипт.