Cron:Examples:LogFileRotate
날짜별로 로그파일 자동 분할 crontab 예제.
목표
Linux 에서 자동으로 파일 크기가 늘어나는 로그 텍스트 파일이 있음
매일 00시 00분 00초 정각에 날짜별로 자동으로 파일명을 "원본파일명-날짜.log" 이렇게 만들어서 분할해주는 스크립트.
즉, 리눅스 환경에서 매일 00시 00분에 로그 파일을 자동 분할하는 스크립트
Bash Script
#!/bin/bash
# 설정
LOG_DIR="/path/to/log" # 로그 파일이 있는 디렉토리 경로
LOG_FILE="yourlog.log" # 원본 로그 파일 이름 (ex: yourlog.log)
# 현재 날짜를 가져옴
TODAY=$(date +"%Y-%m-%d")
# 파일 존재 여부 확인
if [[ -f "$LOG_DIR/$LOG_FILE" ]]; then
# 파일 이름을 날짜별로 복사
cp "$LOG_DIR/$LOG_FILE" "$LOG_DIR/${LOG_FILE%.*}-$TODAY.log"
# 원본 파일 초기화
: > "$LOG_DIR/$LOG_FILE"
else
echo "Not found logfile: $LOG_DIR/$LOG_FILE"
fi
스크립트 실행 권한 추가:
크론탭(crontab) 편집
다음과 같이 수정:
-
0 0 * * *
→ 매일 00:00 정각에 실행 -
/path/to/split_log_daily.sh
→ 위 스크립트 저장한 경로
참고사항
- cp 명령어를 쓰기 때문에, 로그 복사 중간에도 프로그램이 로그를 계속 쓰는 것은 문제없음.
- 파일 초기화는
: > 파일명
으로, 파일 내용을 비우되 파일 자체는 지우지 않음 (파일 디스크립터 유지). - 로그 파일 경로와 이름 설정(
LOG_DIR
,LOG_FILE
)만 알맞게 수정해주면 돼. - cron이 제대로 동작하려면
split_log_daily.sh
파일에 실행 권한 필요:chmod +x /path/to/split_log_daily.sh
스크립트에서 : > filename
의 의미
:
이건 bash (셸)에서 의미가 아주 특별한 "no-op" (no operation) 명령어야. 즉, "아무것도 하지 않는 명령어"야.
구체적으로, :
단독으로는 아무것도 하지 않는다는 뜻인데, >
와 같이 사용하면 다음과 같은 의미가 돼:
: > 파일명
- 파일을 빈 파일로 만든다(초기화)
- > 는 "출력을 파일에 리다이렉션"하는 의미지?
- : 는 "아무 출력도 생성하지 않음"
따라서, "아무것도 없는 것을 파일에 써라"가 돼 → 결국 파일 내용을 0바이트로 만듦
즉, 파일은 그대로 존재하고, 안에 내용만 싹 비워버린다! 왜 rm으로 지우고 다시 만들지 않을까?
rm 명령어로 파일을 지우면 파일 디스크립터(FD, file descriptor)가 끊기기 때문에, 어떤 프로그램이 이 로그 파일을 열어둔 상태(예: 실시간 로그 쓰기 중)라면, 프로그램이 로그 쓰기를 실패하거나 비정상 종료할 수도 있어.
하지만 : > 파일명
으로 초기화하면, 파일은 끊기지 않고 내부 내용만 싹 비우기 때문에 프로그램은 아무런 이상 없이 계속 로그를 쓸 수 있어.