TL; DR
추가 모드 에서 로그 파일을여십시오 .
cmd >> log
그런 다음 다음을 사용하여 안전하게자를 수 있습니다.
: > log
세부
Bourne과 같은 쉘을 사용하면 파일을 쓰기 위해 열 수있는 3 가지 주요 방법이 있습니다. 에서 쓰기 전용 ( >), 읽기 + 쓰기 ( <>) 또는 APPEND (및 쓰기 전용 >>) 모드.
처음 두에서, 커널은 (당신에 의해, 내 말은 현재 위치를 기억 열린 파일 설명 중복 또는 당신이 파일을 연 하나에서 분기하여 상속 한 모든 파일 기술자에 의해 공유는 등)에 있습니다 파일.
할 때 :
cmd > log
log의 stdout에 대해 쉘에 의해 쓰기 전용 모드로 열립니다 cmd.
cmdstdout에 쓸 때 (쉘과 가능한 모든 자식에 의해 생성 된 초기 프로세스) 해당 파일에서 공유 하는 열린 파일 설명에 의해 유지되는 현재 커서 위치에 씁니다 .
예를 들어, cmd처음에을 쓰는 경우 zzz위치는 파일에 바이트 오프셋 4가되고 다음에 해당 파일 cmd또는 자식이 파일에 쓰면 파일이 간격에 따라 커 졌거나 줄어든 지 여부에 관계없이 데이터가 기록됩니다. .
예를 들어 파일이 잘린 경우 파일이 축소 된 경우
: > log
그리고 cmdwrites xx, 그것들 xx은 offset에 쓰여질 4것이고, 처음 3 문자는 NUL 문자로 대체 될 것입니다.
$ exec 3> log # open file on fd 3.
$ printf zzz >&3
$ od -c log
0000000 z z z
0000003
$ printf aaaa >> log # other open file description -> different cursor
$ od -c log
0000000 z z z a a a a
0000007
$ printf bb >&3 # still write at the original position
$ od -c log
0000000 z z z b b a a
0000007
$ : > log
$ wc log
0 0 0 log
$ printf x >&3
$ od -c log
0000000 \0 \0 \0 \0 \0 x
0000006
즉, 쓰기 전용 모드로 열린 파일 (및 읽기 + 쓰기 와 동일한 파일)은 파일 디스크립터가 파일에서 열린 프로세스와 같이 파일의 시작 부분에 NUL 문자가 남는 것처럼 잘라낼 수 없습니다 . 파일 (OS / X를 제외하고 일반적으로 디스크의 공간을 차지하지 않고 드문 파일이 됨)
대신 (대부분의 응용 프로그램이 로그 파일에 쓸 때 그렇게하는 것을 알 수 있습니다) 추가 모드 에서 파일을 열어야 합니다.
cmd >> log
또는
: > log && cmd >> log
빈 파일에서 시작하려면
추가 모드에서는 마지막 쓰기 위치에 관계없이 파일 끝에 모든 쓰기가 수행됩니다.
$ exec 4>> log
$ printf aa >&4
$ printf x >> log
$ printf bb >&4
$ od -c log
0000000 a a x b b
0000005
$ : > log
$ printf cc >&4
$ od -c log
0000000 c c
0000002
두 프로세스가 파일을 실수로 (예 : 같은 데몬의 두 인스턴스를 시작한 것처럼) 열어 놓은 것처럼 출력이 서로 덮어 쓰지 않는 것이 더 안전합니다.
최신 Linux 버전에서는 다음을보고 현재 위치와 파일 디스크립터가 추가 모드 에서 열려 있는지 확인할 수 있습니다 /proc/<pid>/fdinfo/<fd>.
$ cat /proc/self/fdinfo/4
pos: 2
flags: 0102001
또는
$ lsof +f G -p "$$" -ad 4
COMMAND PID USER FD TYPE FILE-FLAG DEVICE SIZE/OFF NODE NAME
zsh 4870 root 4w REG 0x8401;0x0 252,18 2 59431479 /home/chazelas/log
~# lsof +f g -p "$$" -ad 4
COMMAND PID USER FD TYPE FILE-FLAG DEVICE SIZE/OFF NODE NAME
zsh 4870 root 4w REG W,AP,LG 252,18 2 59431479 /home/chazelas/log
이러한 플래그 는 시스템 호출에 전달 된 O ..._ 플래그에 해당 open합니다.
$ gcc -E - <<< $'#include <fcntl.h>\nO_APPEND O_WRONLY' | tail -n1
02000 01
( O_APPEND0x400 또는 8 진수 02000 임)
쉘의는 그래서 >>사용하여 파일을 엽니 다 O_WRONLY|O_APPEND하면서 (그리고 0,100,000 여기이 질문에 관련이 없습니다 O_LARGEFILE입니다) >입니다 O_WRONLY만 (그리고 <>입니다 O_RDWR만).
당신이 할 경우 :
sudo lsof -nP +f g | grep ,AP
로 열린 파일을 검색하기 위해 O_APPEND현재 시스템에 쓰기 위해 열려있는 대부분의 로그 파일을 찾을 수 있습니다.