왜 고양이를 / dev / null로 하시겠습니까?
inode를 그대로 유지하면서 파일 내용을 자르기 위해 그렇게 할 것입니다. 파일을 읽거나 쓰기 위해 열어 둔 모든 프로그램은 파일 크기가 0으로 재설정된다는 사실 외에는 영향을받지 않습니다.
대체로 발견 된 가짜 대안은 파일을 제거한 다음 다시 작성하는 것입니다.
rm file
touch file
또는 유사한 :
mv file file.old
gzip file.old
touch file
문제는 이러한 방법으로 삭제 된 파일을 삭제했을 때 열려있는 프로세스가 이전 파일을 쓰지 못하게하지는 않습니다. 파일이 삭제 될 때 Unix 파일 시스템 아래에있는 이유는 파일 이름 (경로)과 내용 (inode)의 연결 만 해제하는 것입니다. 아이 노드는 읽기 나 쓰기를 위해 열린 프로세스가있는 한 살아있다.
삭제 된 파일을 열 수있는 간단하고 이식 가능한 방법이 없기 때문에 파일 삭제 후 작성된 로그가 손실됩니다. 프로세스가 삭제 된 파일에 쓰는 동안 해당 내용은 여전히 파일 시스템의 공간을 사용합니다. 즉, 디스크를 채우는 중이기 때문에 파일을 제거 / 만들면 디스크는 채워진 상태로 유지됩니다. 후자의 문제를 해결하는 한 가지 방법은 로거 프로세스를 다시 시작하는 것이지만 중요한 서비스 및 중간 로그에 대해서는 그렇게하지 않을 수 있습니다. 생성 한 파일이 원본과 동일한 권한, 소유자 및 그룹을 가질 수 없기 때문에 부작용이 있습니다. 예를 들어, 로그 분석기가 새로 작성된 파일을 읽지 못하게하거나 로깅 프로세스가 자체 로그를 작성하지 못하게 할 수 있습니다.
첫 번째 방법 은 강렬한 도시 전설에도 불구하고cat /dev/null > file
목표를 올바르게 달성 하지만 그 cat /dev/null
부분은 전혀 유용하지 않습니다. 그것은 의도적으로 비어있는 의사 파일을 열고, 아무것도 읽지 못하고 결국 종료합니다. 이 명령을 사용하면 키 입력, 바이트, 시스템 호출 및 CPU 사이클이 낭비되며 의심 할 여지없이 더 빠른 no-op 명령으로 명령을 변경 :
하거나 명령을 전혀 사용하지 않고 대부분의 셸 을 사용하여 기능을 변경하지 않고도 대체 할 수 있습니다 .
쓸모없는 방법을 설명하기 위해 은유를 시도해 봅시다 cat /dev/null
. 유리를 비우는 것이 목표라고 가정 해 봅시다.
링크 된 문서 를 끝까지 읽으면 향상된 스크립트 버전에서이 줄의 주석을 볼 수 있습니다.
cat / dev / null> wtmp # ':> wtmp'및 '> wtmp'는 동일한 효과를 갖습니다.
그들은 실제로; cat /dev/null
코드에 너무 나쁜 것이 유지되었습니다.
즉, 다음 코드는 모든 공통 쉘 (모두 csh
및 sh
패밀리)에서 작동합니다.
cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."
이처럼, 보른 구문을 사용하여 모든 조개와 함께 작동합니다 ash
, bash
, ksh
, zsh
좋아하는 및 :
cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
그러나 이전의 POSIX 이전 Bourne 쉘에서는 cat /dev/null
파일을 계속 실행중인 쉘 스크립트에 의해 작성된 파일을 포함하여 이러한 명령 이 잘리지 않습니다. 0 바이트 파일 대신 크기가 변경되지 않는 스파 스 파일입니다. 파일이 쓰기 전의 현재 위치라고 생각하는 프로세스를 통해 파일을 작성하는 경우에도 마찬가지입니다.
또한 파일을 자르도록 제안 된 일부 대체 솔루션에 결함이 있음을주의하십시오.
다음 두 가지 모두 작업을 수행하지 않습니다. 결과 파일은 비어 있지 않지만 빈 줄이 있습니다. 이렇게하면 wtmp
해당 고정 너비 레코드 와 같은 로그 파일이 손상 됩니다.
echo > file
echo "" > file
BSD sh
옵션을 기반으로 한 다음 옵션은 이식성이 없으며 POSIX는 echo에 허용되는 옵션을 지정하지 않으므로 " -n
" 가있는 행이 포함 된 파일로 끝날 수 있습니다 .
echo -n > file
System V sh
이스케이프 시퀀스를 사용하여 이식 할 수 없습니다 . 일부 쉘은 " \c
" 로 줄을 포함하는 파일을 만듭니다 :
echo "\c" > file
그 작업을 수행하도록 설계된 명령을 사용합니다. truncate
POSIX에 의해 지정되지 않은이 명령이 Unix / Linux 시스템에서 누락 될 수 있기 때문에 사용 중이 아닙니다.
truncate -s 0
마지막으로, 이식성이 있고 작업을 올바르게 수행 할 수있는 몇 가지 대안이 있습니다.