로컬에서 개발 중인 애플리케이션은 현재 타임스탬프로 형식이 지정된 파일에 출력을 기록합니다 app-%Y%m%d.log
.
터미널 창에서 현재 로그를 간단하게 추적할 수 있도록 current.log
오늘의 로그를 가리키는 이라는 심볼릭 링크를 사용했습니다.
매일 작업을 시작하면 tail 프로세스를 종료하고 오늘의 파일에 대한 심볼릭 링크를 지정한 다음 tail -f current.log
.
tail
재부팅하지 않고도 파일 핸들의 대상을 변경하여 심볼릭 링크의 대상을 변경할 수 있습니까 tail
?
이 "새 업무 시작" 작업을 자동화하려면 오늘의 파일에 대한 심볼릭 링크를 가리키도록 cron'ed 스크립트를 설정하는 것이 쉬울 것입니다. 그러나 기존 tail
프로세스는 대상이 변경되었음을 알지 못하는 것 같습니다.
답변1
주기적으로 파일을 닫았다가 다시 열 수 없으면 불가능하다고 생각합니다. tail(또는 다른 프로그램)이 파일을 열면 파일의 inode에 대한 핸들을 얻습니다. 이 시점에서는 파일 이름과 링크가 더 이상 참조되지 않습니다. 이것이 바로 파일 시스템에서 파일을 삭제할 수 있고 이를 여는 모든 프로그램이 계속 작동하는 이유입니다. ;ast 프로그램이 파일을 닫을 때만 실제로 디스크에서 삭제됩니다.
업데이트: 적어도 OS X 버전에는 파일이 이동된 경우 파일을 다시 열 수 있는 -F 옵션이 끝에 있습니다.
답변2
최신 Linux를 사용하는 경우 inotifywait
다음을 사용할 수 있습니다.이노티파이 도구팩. 아직 이 작업을 수행하지는 않았지만 inotifywait
쉘 스크립트에서 심볼릭 링크를 재설정하고 tail -f
심볼릭 링크에서 중지했다가 다시 시작하는 데 사용할 수 있는 것 같습니다. 기호 링크를 처리하고 현재 로그 파일만 추적할 수도 있습니다.
inotify를 사용하지 않는 경우, 읽는 파일 이름의 inode 번호가 변경되었는지 확인하기 위해 꼬리와 같은 프로그램을 직접 작성할 수 있습니다. 이 시점에서 tail-like 프로그램은 이전 파일 설명자를 닫고 이제 다른 파일 이름에 대한 새 파일 설명자를 얻을 수 있습니다. 이것은 작성하기 까다로운 프로그램이며 경쟁 조건이 발생하기 쉽습니다.
답변3
귀하의 설명에 따르면 테일 프로세스를 종료/다시 시작하는 크론 작업을 실행하여 특정 상황을 해결할 수 있는 것 같습니다. 그러나 일반적으로(Mac OS 제외) tail은 파일에서의 위치(즉, 바이트 오프셋)를 기억합니다. 또한 열린 파일 핸들은 심볼릭 링크가 아닌 대상 파일을 가리킵니다. 파일이 열리면 심볼릭 링크는 읽기 프로세스와 관련이 없습니다. 변경 사항이 있을 때 원래 경로를 기반으로 파일을 다시 열 수 있는 기능이 있을 수 있지만 대부분의 구현에서는 이를 수행하지 않습니다.
답변4
프로그램이 파일을 열면 파일이 이동되거나 삭제되더라도 동일한 파일에 계속 액세스합니다. (열린 파일을 삭제하면 해당 파일의 이름만 삭제됩니다. 파일은—인덱스 노드— 열려 있는 프로세스가 없으면 실제로 삭제됩니다. )
일부 프로그램은 열려 있는 파일에 문제가 있는지 모니터링합니다. 예를 들어, 고전적인 프로그램은 tail -f
동일한 파일에 인쇄 줄을 추가합니다. 일부 최신 구현(GNU, FreeBSD, NetBSD, OSX)에는 tail -F
동일한 이름을 가진 새 파일이 제자리로 이동되었는지 감지하고 새 파일에서 읽기 시작하는 이 기능이 있습니다. .다중 꼬리이 작업을 수행하는 것도 가능합니다(실행 multitail --retry
).
당신은 그것을 사용할 수 있습니다통지하다파일 변경 여부를 감지하기 위한 Linux의 인터페이스 또는 다른 unice의 동급 인터페이스입니다. 리눅스에서는,inotifywait
명령 사용.