답변:
이 시도:
truncate -s 0 /var/log/*log
편집하다:
이 작업을 두 번 이상 수행하려면 logrotate
로그를 처리 하는 데 사용해야 합니다. 보통 우분투에 설치됩니다. 살펴보십시오 man logrotate
(또는 설치하지 않은 경우 온라인 맨 페이지를 보거나로 설치하십시오 sudo apt-get install logrotate
)
맨 페이지에서 :
logrotate는 많은 수의 로그 파일을 생성하는 시스템을 쉽게 관리 할 수 있도록 설계되었습니다. 로그 파일을 자동으로 회전, 압축, 제거 및 메일 링 할 수 있습니다. 각 로그 파일은 매일, 매주, 매월 또는 너무 커질 때 처리 될 수 있습니다.
첫 번째 수준 로그 폴더의 로그 파일뿐만 아니라 모든 로그 파일 을 지우려면 다음을 사용할 수 있습니다.
shopt -s globstar # if needed
truncate -s 0 /var/log/*.log # first-level logs
truncate -s 0 /var/log/**/*.log # nested folders, like /var/log/nginx/access.log
이미 logrotate
실행중인 경우 회전 된 .gz
로그도 지워야 합니다.
find /var/log -type f -name '*.[0-99].gz' -exec rm {} +
예를 들어 배포를 위해 VM 어플라이언스 컨테이너를 구축하는 것이 유효합니다.
일상적인 유지 관리의 일환으로이 작업을 수행 할 필요 는 없습니다 . DEM이 올바르게 제안했듯이이를 사용하십시오 logrotate
.
대부분의 POSIX 호환 OS에 일반적으로 적용되는 파일을 완전히 자르는 방법에는 두 가지가 있습니다. 쉘 스크립팅에서 볼 수있는 가장 일반적인 것은 true > file.txt
또는 이와 비슷합니다 : > file.txt
( bash
쉘의 경우 >
리디렉션만으로 충분합니다). 그것은 쓰기 전용을 읽거나 파일 이름이 존재하지 않으면 작성 하거나 기존 파일 이름을 자르는 플래그로 syscall 또는 syscall을 >
통해 파일을 여는 방법 때문 입니다.open()
openat()
O_WRONLY|O_CREAT|O_TRUNC
이를 염두에두고 C에서 다음과 같은 것을 구현할 수 있습니다.
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv){
if (argc == 2){
int fd = open(argv[1],O_TRUNC);
close(fd);
}
return 0;
}
이 코드를 저장하는 파일 이름을로 지정 trunc.c
하고로 컴파일 gcc trunc.c -o trunc
하면에서 제공되는 파일 이름 인수를자를 수있는 작은 유틸리티가 trunc ./foobar.txt
있습니다. 물론이 코드는 다른 검사를 수행하지 않고 첫 번째 위치 매개 변수 만 자릅니다. 둘 이상의 위치 매개 변수를 처리하는 방법을 알아 내기 위해 독자에게 맡길 것입니다. 참고로 truncate()
사용할 수있는 syscall이 있으며 파일을 가변 길이로 자릅니다.
C의 팬이 아니라면 파이썬이 더 쉬울 것입니다. open()
명령은 파이썬에서 동일한 원리로 작동합니다-파일 이름이 존재하면 파일을 쓰고 자르기 위해 파일을 엽니 다. 따라서 우리는 할 수 있습니다
python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy
모든 .log
파일 을 찾는 것과 관련하여 이미 다른 답변에서 다뤘 *
습니다.bash
. 도 있는데 find -type f -name "*.log"
이있는, -exec
(이 특정 경우에 명령을 실행하기위한 플래그 sh -c ''
를 활용하기 >
때문에 >
쉘 연산자가 아닌 외부 실행 파일입니다). 따라서 당신은 할 수 있습니다
find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;
같은 또한 디렉토리에 해당 로그 파일을 주목할 필요가 /var/log
종종 logrotate에 서비스에 의해 회전되므로, 같은 파일 이름 등이있을 것이다 /var/log/service.log
, /var/log/service.log.1
당신이 사용 할 수 있도록, 등 *.log.[1-9]
대신 패턴
무엇보다도 복사 할 수 있습니다 /dev/null
원하는 파일로 . 이상하게도 /dev/null
특수 문자 장치 유형의 파일이지만 다른 곳에서 복사하면 적어도 GNU에서는 결과가 비어있는 일반 파일 cp
입니다. 따라서 우리는 할 수 있습니다
cp /dev/null foo.txt
또는
dd if=/dev/null of=foo.txt
다른 제안 된 독서 :
logrotate 기능으로 회전하기 위해 / var / logs에서 로그를 회전하는 것이 좋지만 원할 때마다 수행하지 않는 것이 좋습니다. 시스템 로그가 인쇄되며 모든 오류를 디버그하는 데 편리합니다.
logrotate를 사용하지 않아야하는 경우 옵션을 탐색 할 수 있습니다. 일부 유닉스 시스템에서는 잘림이 쉬운 옵션이지만이 명령을 즉시 사용할 수 없으므로 설치해야합니다. 새 명령을 설치할 수 없으면 아래 루프를 사용할 수 있습니다.
for logfile $(ls /path/*.log)
do
cat /dev/null > $logfile
done
for logfile in /path/*.log
대신 사용하십시오 .
/var/log
시스템이 나중에 필요할 수있는 메시지를 넣는 위치 는 좋지 않습니다 . 우분투는 전에 문제가 발생했습니다. 읽어보십시오man 8 logrotate;man logrotate.conf
.