tail -f는 WSL의 파일을 따르지 않습니다.

tail -f는 WSL의 파일을 따르지 않습니다.

나는 가지고있다 :

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

Window 11의 로그 파일에 CD를 입력합니다.

/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

핵심 문제는 inotifyWindows 드라이브에 액세스하기 위해 WSL2에서 사용하는 Plan 9(9P) 네트워크 파일 시스템에서 API가 지원되지 않는다는 것입니다. 이는 tail많은 개발 도구(예: )의 "핫 리로드" 기능과 같은 기능에 영향을 미칩니다 npm watch.

이는 다음과 같은 경우 WSL2에서 발생합니다.

  • Linux 앱이 파일 시스템 변경 사항을 감시하기 위해 사용하려고 합니다 inotify(이 경우에는 물론 tail -f) .
  • 파일은 Windows 드라이브에 있습니다(말씀하신 대로 /mnt/d) .
  • (확신합니다) Windows 프로세스가 파일에 쓰고 있습니다. WSL2(예: )에서 Linux 프로세스를 사용하여 파일을 늘리면 가 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에서는 inotifyWindows 드라이브에서 작동합니다.

  • 특히 tail, 약간의 해킹된 해결 방법을 수행할 수 있습니다.

    pwsh.exe -c 'Get-Content <windows_path_to_file> -wait'
    

    노트:

    • PowerShell Core가 설치되어 있지 않은 경우 (권장) 설치하거나 powershell.exe.

    • 언급한 대로 WSL 내부에서 PowerShell을 사용하고 있으므로 다음을 사용하게 됩니다.윈도우파일 경로입니다. 예: D:\xampp-2024-15-01\apache\logs$.

    • 쉘을 중첩할 때 인용/이스케이프가 어려울 수 있습니다.

    • 신용이 SO 답변.-Wait

    • 물론 이를 쉘 함수나 스크립트에 별칭으로 지정하거나 래핑할 수 있습니다.

관련 정보