과거에는 Linux 시스템에서 .NET을 사용하여 크고 열린 로그 파일 (즉, 프로세스에 의해 적극적으로 기록되는 파일)을자를 수있었습니다 cat /dev/null > file.log
.
그러나 10.9 (Mavericks)에서는 그렇지 않은 것 같습니다. 응용 프로그램에 의해 로깅되는 11GB 파일이 있지만 해당 파일에 대해 동일한 명령을 수행하면 아무 일도 일어나지 않는 것 같습니다.
사소한 크기의 파일에서 이것을 시도하면 작동합니다.
여기 있습니다 ls -l /dev/null
:
crw-rw-rw- 1 root wheel 3, 2 Dec 16 12:49 /dev/null
나는 또한 cp /dev/null file.log
아무 소용이 없었습니다.
자르기 기능 ( man 2 truncate
Darwin에서) 을 이용할 수 있다고 생각하면서 이것을 컴파일하고 두 개의 파일에 대해 실행했습니다. 하나는 사소한 크기이고 다른 하나는 실제 로그 파일입니다. 다시 말하지만, 그것은 사소한 파일에 대해 작동했으며 훨씬 더 큰 로그에서는 작동하지 않았습니다.
/*
* Copyright (c) 2013 Thomas de Grivel <[email protected]>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
...
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <unistd.h>
int main (int argc, const char **argv)
{
int e = 0;
while (--argc) {
argv++;
if (truncate(*argv, 0)) {
e = 4;
warn("%s", *argv);
}
}
return e;
}
0
내가 사용하는 파일에 관계없이 프로세스가 반환 됩니다.
cat /dev/null
출력을 생성하지 않는 명령을 작성하는 약간 복잡한 방법입니다. :
또는 true
더 명백한 것입니다.
모든 cat /dev/null > file
,, : > file
심지어 > file
대부분의 셸에서 셸은 stdout에서 O_TRUNC로 파일을 연 다음 아무것도 출력하지 않는 응용 프로그램을 실행 한 다음 파일을 닫고 잘립니다.
그러나이 경우 또는 truncate
시스템 호출을 사용할 때 해당 파일을 채우는 프로세스가 O_APPEND 플래그로 파일을 열지 않은 경우 다음에 파일에 열려있는 파일 설명자에 쓸 때 파일 내에 있던 오프셋의 데이터.
HFS +는 스파 스 파일을 지원하지 않기 때문에 해당 오프셋 앞의 공간을 시스템에서 재 할당하고 0으로 채워야합니다.
따라서 파일을 자르기 전에 해당 파일에 쓰고있는 응용 프로그램을 종료해야합니다. 또는 응용 프로그램이 O_APPEND
( >>
셸 리디렉션을 사용 하는 경우 와 같이) 파일을 열도록해야합니다 .
실험하고 싶다면 :
$ exec 3> x
$ yes | head -n 50000 >&3
$ ls -ls x
200 -rw-r--r-- 1 me me 100000 Dec 16 21:32 x
이제 내 셸의 fd 3은 파일 내에서 100,000 바이트입니다.
$ : > x
$ ls -ls x
0 -rw-r--r-- 1 me me 0 Dec 16 21:34 x
이제 파일이 잘립니다 (크기 0, 디스크에 사용 된 공간 없음).
$ echo >&3
$ ls -ls x
200 -rw-r--r-- 1 me me 100001 Dec 16 21:34 x
오프셋 100000에서 파일에 1 바이트를 쓰면 파일 크기는 이제 100001 바이트이고 첫 번째 파일은 모두 0이며 HFS +에서는 100k 이상을 사용하지만 대부분의 다른 Unix 파일 시스템에서는 약 하나의 디스크 블록 만 사용합니다.
반면에 :
$ exec 3>> x
$ yes | head -n 50000 >&3
$ ls -ls x
200 -rw-r--r-- 1 me me 100000 Dec 16 21:35 x
$ : > x
$ echo >&3
$ ls -ls x
8 -rw-r--r-- 1 me me 1 Dec 16 21:36 x
오프셋 100000이 아니라 파일 끝에 1 바이트를 씁니다 O_APPEND
. 파일 크기는 1 바이트이며 해당 1 바이트를 저장하는 데 필요한 공간을 차지합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다