cat /dev/null 내 로그 파일을 비웠지만 크기는 변경되지 않았습니다.

cat /dev/null 내 로그 파일을 비웠지만 크기는 변경되지 않았습니다.

저는 유닉스를 처음 접했습니다. Solaris 10을 사용하면서 다음과 같은 문제가 발생했습니다.

9.5G 크기의 대용량 로그 파일이 있습니다. 다음 명령을 사용하여 파일을 지워 보았습니다.

# cat /dev/null file_log.txt

이렇게 해서 파일 시스템의 공간을 되찾았지만 파일 크기는 여전히 동일하고 증가하고 있습니다. 프로세스가 아직 로그 파일에서 실행 중인 것 같습니다.

파일 크기를 수정할 수 있는 방법이 있나요? 이것이 내 파일 시스템에 영향을 미치나요?

답변1

당신이 말하고 싶다고 가정하자

cat /dev/null > file_log.txt

또는

cp /dev/null file_log.txt

이 질문에 대한 동일한 효과의 대답은 쓰기 위해 파일을 여는 프로세스가 없이 수행되거나 O_APPEND파일의 오프셋을 임의로 설정한다는 것입니다.스파스 파일건설되다.

매뉴얼 페이지에서는 write(2)이를 매우 명확하게 설명합니다.

검색 가능한 파일(즉, 일반 파일과 같이 lseek(2)을 적용할 수 있는 파일)의 경우 쓰기는 파일 오프셋에서 발생하며 파일 오프셋은 실제로 쓴 바이트 수만큼 증가됩니다. O_APPEND(2)를 사용하여 파일을 연 경우 파일 오프셋은 쓰기 전에 먼저 파일 끝으로 설정됩니다. 파일 오프셋 조정 및 쓰기 작업은 원자적 단계로 수행됩니다.

위의 오프셋은 속성입니다.해당 파일 설명자쓰기 프로세스에 대한 영향 - 다른 프로세스가 파일을 자르거나 파일에 자신을 쓰는 경우 이는 오프셋에 영향을 미치지 않습니다. (또한 만약에같은프로세스는 O_APPEND이 목적을 위해 다른 파일 설명자를 받지 않고 쓰기 위해 파일을 열며, 새 파일 설명자를 통해 파일에 쓰는 것은 동일한 효과를 갖습니다. )

이 과정을 가정해보자추가하지 않고 쓰기 위해 파일을 열고 파일 설명자를 생성합니다.FD. 그런 다음 stat()파일이 잘리면(예: 파일에 복사) 파일 크기에 대한 영향(보고된 대로)이 취소됩니다./dev/null에 쓰기FD. 구체적 write()으로는FD시스템은 다음으로 이동("탐색")합니다.FD, 파일의 현재 끝 부분(완전히 잘린 경우 시작 부분까지)부터 오프셋까지 0으로 공간을 채웁니다. 그러나 파일이 커지면더 큰그동안 다음 주소로 편지를 보내세요.FD파일의 내용은 오프셋부터 덮어쓰기됩니다.

스파스 파일은 "구멍"을 포함하는 파일입니다. 여기서 시스템은 0이 있는 큰 영역이 있다는 것을 "인식"하지만 이러한 영역은 실제로 디스크에 기록되지 않습니다. 이것이 du동의하지 않는 이유입니다 ls. du실제 디스크 사용량을 살펴보고 파일 크기 속성을 추출하는 데 ls사용하세요 .stat()

해결 방법: 프로세스를 다시 시작하십시오. 가능하다면 사용할 파일을 여는 부분(혹은 O_APPEND사용시 모드)을 다시 작성하세요.afopen()

답변2

cat /dev/null아무것도 출력하지 않기 때문에 작동하지 않습니다. cp /dev/null file또한 의미가 없습니다.

파일 내용을 지우는 더 쉬운 방법은 null 명령을 파일로 리디렉션하는 것입니다.

: > file

심지어 대부분의 쉘에서는 명령을 지정하지 않고 리디렉션을 사용합니다.

> file  

보고된 크기가 여전히 높다는 사실은 ls단순히 쓰기 프로세스가 쓰기 전에 파일 끝을 찾는다는 예상된 아이디어 때문입니다. 검색 지점 앞에는 "아무것도" 없으므로 문제가 되지 않습니다. 유일한 위험은 비희소 파일 인식 도구를 사용하여 영향을 받는 파일을 백업하거나 복사하려는 것입니다.

파일이 "구멍이 있는" 상태로 남아 있기 때문에 쓰기 프로세스를 다시 시작해도 공간이 "복구"되지 않습니다.

보고된 파일 크기를 정말로 0으로 만들고 싶다면 파일을 비우기 전에 쓰기 프로세스를 중지(종료)해야 합니다.

답변3

고양이 /dev/null file_log.txt

이렇게 하면 고양이가 /dev/null즉시 결과를 읽고 file_log.txt결과를 stdout화면에 출력하게 됩니다. 이렇게 해도 아무것도 삭제되지 않습니다.

테스트하고 싶다면 사용해 보세요 cat /dev/null non_existent_file. 그러면 문제가 발생한다는 것을 알게 될 것입니다.

파일을 자르는 올바른 방법은 쉘 리디렉터나 모든 종류의 편집기를 사용하여 줄을 제거하는 것입니다. 당신이 할 계획은 다음과 같습니다

cat /dev/null > file_log.txt

이것이 첫 번째 방법입니다.

관련 정보