Skip to content

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

스크립트 실행 권한 추가:

chmod +x /path/to/split_log_daily.sh

크론탭(crontab) 편집

crontab -e

다음과 같이 수정:

0 0 * * * /bin/bash /path/to/split_log_daily.sh
  • 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) 명령어야. 즉, "아무것도 하지 않는 명령어"야.

구체적으로, : 단독으로는 아무것도 하지 않는다는 뜻인데, &gt 와 같이 사용하면 다음과 같은 의미가 돼:

: > 파일명

  • 파일을 빈 파일로 만든다(초기화)
  • > 는 "출력을 파일에 리다이렉션"하는 의미지?
  • : 는 "아무 출력도 생성하지 않음"

따라서, "아무것도 없는 것을 파일에 써라"가 돼 → 결국 파일 내용을 0바이트로 만듦

즉, 파일은 그대로 존재하고, 안에 내용만 싹 비워버린다! 왜 rm으로 지우고 다시 만들지 않을까?

rm 명령어로 파일을 지우면 파일 디스크립터(FD, file descriptor)가 끊기기 때문에, 어떤 프로그램이 이 로그 파일을 열어둔 상태(예: 실시간 로그 쓰기 중)라면, 프로그램이 로그 쓰기를 실패하거나 비정상 종료할 수도 있어.

하지만 : > 파일명으로 초기화하면, 파일은 끊기지 않고 내부 내용만 싹 비우기 때문에 프로그램은 아무런 이상 없이 계속 로그를 쓸 수 있어.

See also