crontab 와 anacron 과 logrotate 의 관계 에 대한 상세 한 설명

8157 단어
crontab 와 anacron 과 logrotate 의 관 계 는 서버 의 nginx 에서 logrotate 를 사용 하여 로 그 를 분할 하고 매일 분할 하도록 설정 합 니 다.그러나 logrotate 는 작업 이 없 는 것 같 습 니 다. 로 그 는 분할 되 지 않 았 습 니 다.서버 는 CentOS 6 입 니 다.
원인 을 찾기 위해 서 나 는 잘못된 부분 을 차근차근 분석 했다.logrotate 가 실행 되 지 않 았 다 면 crond 가 시작 되 지 않 았 을 수도 있 습 니 다. logrotate 가 / etc / cron. daily / logrotate 스 크 립 트 에 의 해 시작 되 었 기 때문에 코드 를 볼 수 있 습 니 다.
[root@test ~]# cat /etc/cron.daily/logrotate#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.confEXITVALUE=$?if [ $EXITVALUE != 0 ]; then/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"fiexit 0
logrotate 가 실 행 될 때 설정 파일 logrotate. conf 를 불 러 오 는 것 을 볼 수 있 습 니 다. 이 설정 파일 은 분할 로그 와 관련 된 옵션 을 설정 하 는 것 외 에 로 그 를 분할 하 는 설정 파일 디 렉 터 리 / etc / logrotate. d 도 포함 되 어 있 습 니 다.내 nginx 로그 분할 프로필 은 logrotate. d 디 렉 터 리 에 저 장 됩 니 다:
[root@test ~]# cat !$cat /etc/logrotate.d/nginx/root/*.log {DailyMissingokrotate 52compressdelaycompressnotifemptycreate 644 nobody nobodysharedscriptspostrotate[ -f /usr/local/nginx/logs/nginx.pid ] && kill -USR1 cat /usr/local/nginx/logs/nginx.pid endscript}
/ root /. log 는 분 단 된 로그 가 필요 한 디 렉 터 리 입 니 다. 어댑터 는 디 렉 터 리 에 있 는 모든 로그 파일 이 분 단 된 것 을 표시 합 니 다. 분 단 된 규칙 은 {...} 의 내용 입 니 다.여기 서 / root / *. log 를 nginx 로그 로 생각 하 는 것 은 테스트 를 위 한 것 입 니 다.crond 서 비 스 를 시작 한 후에 로그 가 분할 되 지 않 은 것 을 발 견 했 습 니 다. 그래서 / etc / logrotate. d / nginx 설정 파일 의 문법 에 문제 가 있 는 지 생각 했 습 니 다. 다음 명령 을 사용 하여 이 파일 을 디 버 깅 합 니 다.
logrotate - vfd / etc / logrotate. d / nginx \ # - vfd 세 가지 옵션 은 각각 상세 한 정 보 를 표시 하고 로 그 를 강제 분할 합 니 다. 실제 분할 로그 가 아 닌 디 버 깅 프로필 일 뿐 입 니 다.
출력 결과 에 따 르 면 문법 오류 가 있 습 니 다. Daily, Missingok 은 모두 소문 자 여야 합 니 다.데 일리 로 바 꿔, missingok.설정 파일 을 다시 디 버 깅 하면 로 그 를 정확하게 분할 할 수 있 습 니 다:
[root@test~] \ # ls - 1 / root / install - 2017 - 5 - 14. loginstall - 2017 - 5 - 14. log - 20170521 \ # logrotate 압축 파일 의 로그
위 에 서 는 crond 가 / etc / cron. daily / 내 스 크 립 트 를 실행 하고 로그 rotate 로그 분할 을 포함 하여 정기 적 으로 계획 작업 을 수행 할 것 이 라 고 추측 합 니 다.정확 한 지 검증 하기 위해 인터넷 에서 검색 해 답 을 찾 았 다.crontab 명령 이 없 으 면 먼저 설치 합 니 다:
yum install crontabs \ # crond 를 설치 합 니 다. crond 는 실제로 cronie 가방 에서 왔 습 니 다. 이 가방 은 crontabs 가방 의 의존 으로 chkconfig -- add crond \ # 부팅 시작 목록 에 추 가 됩 니 다. chkconfig crond on \ # 부팅 crond 서비스 / etc / init. d / crond \ # 즉시 crond 를 시작 합 니 다.
다음 파일 이나 디 렉 터 리 의 역할: cron 계획 작업 은 두 가지 유형 이 있 습 니 다. 1) 시스템 cron 작업: crond 서비스 에서 수행 되 며, / etc / crontab 설정 시스템 등급 의 작업 2) 사용자 cron 작업: crond 서비스 에서 수행 되 며, crontab 명령 으로 사용자 등급 의 작업 을 편집 합 니 다.
시스템 cron 작업 에 속 하 는 파일 이나 디 렉 터 리: / etc / cron. d \ # 시스템 작업 스 크 립 트.rpm - ql cronie 를 실행 하면 이 디 렉 터 리 가 cronie 패키지 에 설치 되 어 있 는 / etc / cron. hourly \ # 시간 당 스 크 립 트 를 실행 하 는 것 을 볼 수 있 습 니 다.이 중 0 anacron 파일 은 anacron 을 호출 하여 작업 을 수행 합 니 다. 크 로 니 - anacron 에 의 해 설치 / etc / cron. daily \ # 매일 내부 스 크 립 트 를 실행 합 니 다.또한 anacron 에서 내부 스 크 립 트 를 실 행 했 습 니 다. logrotate 호출 스 크 립 트 는 이 디 렉 터 리 에 있 습 니 다. / etc / cron. weekly \ # 매주 스 크 립 트 를 실행 합 니 다. /etc / cron. monthly \ # 매달 스 크 립 트 를 실행 합 니 다.
사용자 cron 작업 의 실행 을 제어 합 니 다: / etc / cron. allow \ # 기본적으로 존재 하지 않 습 니 다. 이 파일 이 존재 한다 면 사용자 만 이 파일 에 crontab 명령 / etc / cron. deny \ # crontab 명령 을 사용 할 수 없 는 사용 자 를 기록 할 수 있 습 니 다.
메모: cron. allow 와 cron. deny 는 사용자 이름 의 목록 입 니 다. 줄 마다 사용자 이름 입 니 다.예 를 들 어 cron. deny 에 jason 이 있 습 니 다. 효 과 는 현재 로그 인 사용자 가 jason 이면 crontab - e 를 실행 하면 crontab 명령 을 사용 할 수 없다 는 것 을 알려 줍 니 다.
다음 세 개의 디 렉 터 리 의 역할: / var / spool / cron / USERNAME \ # 이 파일 이 야 말로 crontab - e / - l 과 연 결 된 것 입 니 다. 이 파일 은 crontab - e 가 편집 한 작업 내용 을 저장 합 니 다. \ # 예 를 들 어 crontab - u root - e 를 실행 하고 편집 하여 저장 하면 / var / spool / cron / root 이 파일 이 있 습 니 다.
/ var / spool / anacron / {cron. daily, cron. monthly, cron. weekly} \ # 이 세 파일 은 anacron 이 지난번 에 실 행 했 던 시간 (전날, 지난주 또는 지난달) 을 기록 합 니 다. \ # anacron 작업 을 수행 할 때 이 시간 을 대조 하여 anacron 작업 을 수행 할 지 여 부 를 결정 합 니 다.
/ var / lib / logrotate. status \ # 이 파일 은 logrotate 실행 상황 을 기록 합 니 다. logrotate 는 이 파일 을 참고 하여 rotate 로그 가 필요 한 지 여 부 를 결정 합 니 다.
crontab 와 anacron 과 logrotate 의 관계:
[root@test~] \ cat / etc / cron. d / 0 hourly \ # 이 파일 은 시간 당 01 분 실행 / etc / cron. hourly 내의 모든 스 크 립 트 SHELL = / bin / bashPATH = / sbin: / bin: / usr / sbin: / usr / binMAILTO = rootHOME = / 01 root run - parts / etc / cron. hourly \ # 여기 루트 에서 작업 을 수행 할 사용 자 를 지정 합 니 다. run - parts 는 사실 실행 가능 한 스 크 립 트 입 니 다. / usr / bin / run - parts 에서.cron. hourly 디 렉 터 리 에 있 는 모든 스 크 립 트 를 실행 합 니 다.
설명: crontab - e 명령 으로 사용자 의 cron 설정 을 편집 할 때마다 cron 은 자동 으로 / var / spool / cron 에서 이 사용자 와 같은 이름 의 파일 을 생 성 합 니 다. 이 사용자 의 cron 정 보 는 이 파일 에 기 록 됩 니 다.cron 이 시 작 된 후 시계 마다 이 파일 을 읽 고 명령 을 실행 할 지 확인 합 니 다.따라서 이 파일 을 수정 하면 cron 서 비 스 를 다시 시작 할 필요 가 없습니다.cron 서 비 스 는 1 분 에 한 번 씩 / var / spool / cron 에 있 는 모든 파일 을 읽 어야 할 뿐만 아니 라 / etc / crontab 도 읽 어야 하기 때문에 이 파일 을 설정 하면 cron 서 비 스 를 이용 하여 뭔 가 를 할 수 있 습 니 다.crontab 명령 으로 설정 하 는 것 은 한 사용 자 를 위 한 것 이 고 편집 / etc / crontab 는 시스템 을 위 한 작업 입 니 다.이 파일 의 파일 형식 은:
SHELL = / bin / bashPATH = / sbin: / bin: / usr / sbin: / usr / bin \ # 실행 가능 한 파일 찾기 경로 MAILTO = root \ # 오류 가 발생 하거나 데이터 출력 이 있 으 면 데 이 터 를 메 일 로 이 계 정 HOME = / \ # 사용자 가 실행 하 는 경로 입 니 다. 여 기 는 루트 디 렉 터 리 입 니 다.
[root@test~] \ cat / etc / cron. hourly / banacron \ # cron. hourly 디 렉 터 리 에 있 는 스 크 립 트 는 조건 에 따라 anacron 명령 을 수행 합 니 다 \ #! /bin/bash
Skip excecution unless the date has changed from the previous run
if test -r /var/spool/anacron/cron.daily; thenday= cat /var/spool/anacron/cron.daily fiif [ date +%Y%m%d = "$day" ]; thenexit 0;fi
Skip excecution unless AC powered
if test -x /usr/bin/on_ac_power; then/usr/bin/on_ac_power &> /dev/nullif test $? -eq 1; thenexit 0fifi/usr/sbin/anacron -s
[root@test~] \ # cat / etc / anacrontab \ # anacron 명령 을 실행 하면 다음 에 anacron 설정 파일 을 봅 니 다.
/etc/anacrontab: configuration file for anacron
See anacron(8) and anacrontab(5) for details.
SHELL=/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root
the maximal random delay added to the base delay of the jobs
RANDOM_DELAY = 45 \ # 최대 지연 시간
the jobs will be started during the following hours only
START_HOURS_RANGE = 3 - 22 \ # 3 - 22 시 사이 에 만 미 션 수행
#period in days delay in minutes job-identifier command1 5 cron.daily nice run-parts /etc/cron.daily7 25 cron.weekly nice run-parts /etc/cron.weekly@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
이상 anacrontab 설정 파일 의 가장 중요 한 부분 은 마지막 부분 입 니 다. 이 행동 예: 15 cron. daily nice run - parts / etc / cron. daily
매일 / etc / cront. daily / 디 렉 터 리 에 있 는 스 크 립 트 파일 을 실행 하 는 것 을 의미 합 니 다. 실제 지연 은 RANDOM 입 니 다.DELAY+delay。여기 지연 은 5 분 입 니 다. 위 에 있 는 RANDOM 까지.딜 레이, 그래서 실제 지연 시간 은 5 - 50 사이 이 고 시작 시간 은 03 - 22 시 이 며 기계 가 꺼 지지 않 으 면 보통 03: 05 - 03: 50 사이 에 실 행 됩 니 다.nice 명령 은 이 프로 세 스 를 nice = 10 으로 설정 합 니 다. 기본 값 은 0, 즉 낮은 우선 순위 프로 세 스 입 니 다.하면, 만약, 만약...DELAY = 0, 그러면 정확 한 5min 지연, 즉 03: 05 cron. daily 내 스 크 립 트 를 실행 하 는 것 을 의미 합 니 다.
[root@test~] \ # cat / etc / cron. daily / logrotate \ # 마지막 으로 cron. daily 에 logrotate 호출 스 크 립 트 가 있 습 니 다 \ #! /bin/sh
/ usr / sbin / logrotate / etc / logrotate. conf \ # logrotate 는 설정 파일 을 읽 고 / etc / logrotate. d / nginxEXITVALUE = $를 읽 습 니 다.if [ $EXITVALUE != 0 ]; then/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"fiexit 0
logrotate 명령 이 / etc / logrotate. d / nginx 설정 파일 을 불 러 왔 을 때 nginx 로그 의 압축 파일 날 짜 를 비교 해 야 합 니 다.
[root@test~] \ cat / var / lib / logrotate. status | grep / root "/ root / install - 2017 - 5 - 14. log" 2017 - 5 - 21 \ # 오늘 이 2017 - 5 - 21 이 라면 이 파일 도 2017 - 5 - 21 입 니 다. 이것 은 오늘 이미 압축 파일 을 했 음 을 의미 합 니 다. 그렇지 않 으 면 nginx 로 그 를 압축 (분할) 합 니 다.
종합 적 으로 전체 논리 프로 세 스 는 crond 서비스 로드 / etc / cron. d / 0 hourly - > 매 시간 01 분 에 실행 / etc / cront. hourly / banacron - > 실행 anacron - > 실행 anacron - > / etc / anacrontab 설정 에 따라 실행 / etc / cron. daily, / etc / cron. weekly,/ etc / cron. monthly --- > 실행 / etc / cron. daily / 하의 logrotate 스 크 립 트 --- > 실행 logrotate --- > 실행 / etc / logrotate. conf 설정 에 따라 실행 스 크 립 트 / etc / logrotate. d / nginx --- > 분할 nginx 로그 성공

좋은 웹페이지 즐겨찾기