나는 tail -F
명령을 사용하지 않고 항상 사용했지만 누군가는 많은 설명 없이 tail -f
그것이 더 낫다고 말했습니다 .-F
tail 명령에 대한 매뉴얼 페이지를 찾았습니다.
-f output appended data as the file grows;
-F Same as --follow=name --retry
--retry Keep trying to open a file even when it is or becomes inaccessible
Lower가 수행하는 작업을 이해하기는 쉽지만 Upper Case가 수행하려는 -f
작업을 따르지 않습니다 . -F
누군가 나에게 차이점을 설명해 주시면 감사하겠습니다.
답변1
GNU tail
유틸리티를 설명합니다. 이 두 플래그의 차이점은 파일을 열면 예를 들어 다음과 같은 로그 파일이 있다는 것입니다.
$ tail -f /var/log/messages
... 그리고 내 컴퓨터의 로그 회전 기능이 메시지가 기록되는 동안 해당 로그 파일을 회전하기로 결정한 경우("회전"은 삭제 또는 다른 위치로 이동 등을 의미함), 내가 보는 출력은 멈추다.
다음과 같이 파일을 열면 tail
:
$ tail -F /var/log/messages
... 그리고 다시, 파일이 회전되고 출력은 내 콘솔에서 계속 흐릅니다. 파일이 tail
다시 사용 가능해지면 바로 파일을 다시 열 것이기 때문입니다. 즉, 로그에 쓰는 프로그램이 로그에 쓰기 시작하면새로운 /var/log/messages
.
-F
무료 BSD 시스템에는 옵션이 없지만 GNU 시스템에서 tail -f
와 같이 동작하지만 tail -F
메시지를 받는다는 차이점이 있습니다.
tail: file has been replaced, reopening.
모니터링 중인 파일이 사라졌다가 다시 나타날 때 출력에 표시됩니다.
이것을 테스트할 수 있습니다
하나의 쉘 세션에서 다음을 수행하십시오.
$ cat >myfile
이제 여러분이 내용을 입력할 때까지 기다립니다. 그냥 횡설수설 몇 줄을 입력해 보세요. 그것은 모두 파일에 저장됩니다 myfile
.
~ 안에또 다른쉘 세션(아마도 다른 터미널에 있을 수도 있습니다.방해하지 않고cat
):
$ tail -f myfile
myfile
그러면 콘솔의 (끝) 내용이 표시됩니다 . 첫 번째 셸 세션으로 돌아가서 더 많은 내용을 입력하면 해당 출력이 tail
두 번째 셸 세션에서 즉시 표시됩니다.
이제 cat
를 눌러 종료 Ctrl+D하고제거하다파일 myfile
:
$ rm myfile
그런 다음 고양이를 다시 실행하십시오.
$ cat >myfile
...그리고 몇 줄을 입력합니다.
GNU를 사용하면 tail
다음 줄은~ 아니다두 번째 셸 세션( tail -f
아직 실행 중임)에 표시됩니다.
운동을 반복하고 tail -F
차이점을 관찰하십시오.
답변2
간단히 말해서, 파일을 열면 파일이 디스크에서 정확히 어디에 있는지에 대한 일부 메타데이터가 포함된 inode를 얻게 됩니다. 그러면 Tail이 해당 파일의 변경 사항을 수신합니다.
파일을 제거하고 동일한 이름으로 새 파일을 생성하면 파일 이름은 동일하지만 inode가 다릅니다(그리고 아마도 디스크의 다른 위치에 저장될 것입니다). tail -f
채우기를 다시 시도하지 않고 새 inode를 로드하면 tail -F
이를 감지합니다.
파일 이름을 바꾸거나 파일을 이동하는 경우에도 동일한 효과가 발생합니다. 예를 들어 다음 /var/log/messages
과 logrotate가 로그를 /var/log/messages.1
. tail 은 -f
여전히 를 가리키는 이전 inode를 수신합니다 messages.1
. tail을 사용하면 -F
이를 인식하고 새 inode를 읽을 수 있습니다.