"tail -f"와 "tail -F"의 차이점은 무엇입니까?

"tail -f"와 "tail -F"의 차이점은 무엇입니까?

나는 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를 읽을 수 있습니다.

관련 정보