로거가 삭제된 파일을 계속 기록하려면 어떻게 해야 합니까?

로거가 삭제된 파일을 계속 기록하려면 어떻게 해야 합니까?

~에서유닉스 전동 공구, 제3판:파일을 삭제하지 말고 비우십시오.부분:

활성 프로세스에 파일이 열려 있는 경우(로그 파일의 경우 일반적임) 파일을 삭제하고 새 파일을 생성해도 해당 메시지에 영향을 미치지 않습니다.더 이상 연결되지 않은 파일에는 계속 액세스할 수 있습니다.. 파일을 지워도 연결이 끊어지지 않으므로 로깅 프로그램에 영향을 주지 않고 파일이 지워집니다.

(내 것을 강조하다)

프로그램이 삭제된 파일을 계속 기록하는 이유를 이해할 수 없습니다. 파일 설명자 항목이 프로세스 테이블에서 제거되지 않았기 때문입니까?

답변1

파일을 삭제하면 실제로 해당 파일(inode)에 대한 링크가 삭제됩니다. 누군가 이미 파일을 열어 둔 경우 자신이 소유한 파일 설명자를 유지할 수 있습니다. 파일은 디스크에 남아 공간을 차지하며 파일에 액세스할 수 있는 경우 파일에 쓰고 읽을 수 있습니다.

이것unlink기능POSIX는 다음 동작을 정의합니다.

파일의 링크 수가 0에 도달하고 파일을 여는 프로세스가 없으면 파일이 차지하는 공간이 해제되고 파일에 더 이상 액세스할 수 없습니다. 마지막 링크가 제거되었을 때 하나 이상의 프로세스에서 파일이 열려 있었다면 unlink()가 반환되기 전에 링크를 제거해야 합니다.파일 내용 삭제는 파일에 대한 모든 참조가 닫힐 때까지 연기되어야 합니다..

이 조언은 이러한 동작 때문에 제공됩니다. 데몬은 파일을 열고 파일이 삭제되었음을 알지 못합니다(파일을 특별히 모니터링하는 경우는 제외하지만 이는 드문 일입니다). 자신이 소유한 기존 파일 설명자에 계속해서 쓸 것입니다. 디스크에서 (더 많은) 공간을 계속 차지하지만 기록된 메시지를 볼 수 없으므로 실제로 최악의 상황에 처해 있습니다. 두 세계의. 파일 길이를 0으로 자르면 공간이 즉시 비워지고 새 메시지가 파일의 새 끝에 추가되어 볼 수 있습니다.

결국 데몬이 종료되거나close문서, 공간이 공개됩니다. 새로운 사람은 동시에 파일을 열 수 없습니다(시스템별 반영 인터페이스를 통한 경우 제외).리눅스/proc/x/fd/...). 또한 다음을 보장합니다.

파일의 링크 수가 0인 경우 파일과 관련된 모든 파일 설명자가 닫히면 파일이 차지하는 공간이 해제되고 파일에 더 이상 액세스할 수 없습니다.

따라서 디스크 공간이 영구적으로 손실되지는 않지만 파일을 삭제해도 아무런 이점이 없으며 새 메일에 액세스할 수 없습니다.

답변2

정확히.

문서는 세 부분으로 구성되어 있습니다.

  • 단일 바이트 배열인 콘텐츠는 디스크의 특정 위치에 기록되거나 즉시 생성됩니다.
  • 이것인덱스 노드, 또는인덱스 노드간단히 말해서 커널에 의해 채워지고 사용되는 데이터 구조입니다. 여기에는 파일 내용의 위치에 대한 포인터뿐 아니라 파일에 대한 모든 메타데이터(크기, 권한 등)가 포함됩니다.
  • 하나 이상디렉토리 항목, 위치는 다음과 같이 조작됩니다.와 마찬가지로 /home/user/personal_file파일 작업, 내용 수정, 메타데이터 변경 등을 수행할 수 있는 핸들 역할을 합니다.

파일을 열 때 운영 체제에 대한 경로를 제공하면 운영 체제가 인덱스 노드에 대한 핸들을 직접 반환합니다. 파일 설명자라고 하는 이 핸들을 사용하면 필요에 따라(또는 적어도 운영 체제에서 허용하는 대로) 파일을 조작할 수 있습니다.

inode를 직접 삭제할 수는 없습니다.운영 체제에서 삭제를 요청합니다. 따라서 파일을 삭제하려면 디렉토리 항목을 삭제하면 됩니다. 파일에 다른 디렉토리 항목이 있으면 계속해서 액세스할 수 있으며, 그렇지 않은 경우에도 해당 inode는 삭제되지 않고 해당 파일을 가리키는 파일 설명자가 계속 남아 있습니다. @MichaelHomer의 답변은 이 특정 주제에 대해 더 기술적이고 자세합니다.

답변3

다른 두 답변은 문제를 매우 잘 설명합니다. 모든 디렉토리가 링크될 때까지 파일은 "제거"되지 않습니다.그리고열려 있는 파일 설명자가 모두 사라졌습니다.

이를 방지하려면 다음을 사용하는 것이 좋은 습관입니다.

> /var/log/bigfile

바꾸다

rm -f /var/log/bigfile

내용을 삭제하는 것이 아니라 내용을 0바이트로 재설정하기 때문에 작성된 내용을 계속 볼 수 있습니다.

파일을 삭제하고 Linux에서 /proc/fd 파일 시스템을 사용하는 경우에도 계속 사용할 수 있습니다.

> /proc/12345/fd/3

파일 내용을 0으로 만듭니다(12345가 프로세스 ID이고 3이 대용량 파일의 fd 번호라고 가정). 디스크가 가득 차고 어떤 이유로 로그 파일에 기록하는 프로세스를 종료할 수 없는 경우 이는 생명의 은인이 될 수 있습니다.

관련 정보