linux - cron, crontab

System/Linux 2013. 8. 23. 11:29


  • 예약 실행 기능 사용하기
    • 정해진 시각에 설정해 둔 내용이 실행될 수 있는 환경을 구축한다.
      • 이를 위해서는 데몬 형태로 항상 시간을 체크하고 해당 시간에 지정된 명령어를 실행하는 프로그램을 설치해야 한다.
      • 이 역할을 하는 프로그램은 cron, anacron 그리고 at가 있다.
        • cron(chronometer; 정확한 시계?) : 주기적으로 반복되는 작업을 수행하기 위한 데몬.  지정된 시간에 시스템의 전원이 꺼져 있으면 예약된 내용은 실행 안됨.  
        • anacron(ana-chronometer; 뒤에 실행되는 정확한 시계?) : 전원이 꺼져 있을 때 실행되지 못한 예약작업을 전원이 켜지면 실행해주는 기능을 가진 데몬.
        • at(at a specified time; 지정된 시간에) : 일시적으로 한번만 수행되는 작업을 예약하기 위한 데몬.
      • 여기에서는 필요에 의해 사용할 수 있도록 두가지 프로그램을 모두 설치한다.
    • 패키지 설치
      • cron 설치
        • vixie-cron-3.0.1-74.i386.rpm (용량 : 51,851 ) : 반복 예약실행 기능을 담당하는 데몬.  Vixie가 만든 cron에는 보안 강화와 더불어 좀 더 강력한 옵션 설정 기능이 추가되어 있다.
      • anacron 설치
        • anacron-2.3-29.i386.rpm (용량 : 34,776 ) : 전원이 꺼져 있는 경우에도 반복 예약 실행 기능을 사용할 수 있는 데몬.
          • crontabs-1.10-5.noarch.rpm (용량 : 4,741 ) : 예약 실행 기능을 설정하는 프로그램.
      • at 설치
        • at-3.1.8-46.i386.rpm (용량 : 44,942 ) : 지정된 시간에 일회성 예약 실행 기능을 수행하는 데몬.
    • 기본 설정
      • cron 설정
        • 프로그램을 설치하면 /etc/rc.d/init.d/crond가 설치되고, 런레벨 2, 3, 4, 5에서 실행되도록 설정된다.
          • 결국 부팅하면 예약 실행 기능은 자동으로 작동되게 되고, 사용자는 예약 작업을 추가하기만 하면 되는 것이다.
          • 하지만 우선은 설치 후 부팅 과정을 거치지 않았기 때문에 crond를 수동으로 작동시켜야 한다.
            • /etc/rc.d/init.d/crond start ↙
        • 이렇게 실행된 crond는 매분 마다 /etc/crontab, /etc/cron.d, /var/spool/cron/USERNAME의 설정파일 변경사항을 점검해서 예약 실행에 반영한다.  여기에서 언급된 각 설정 파일은 아래에서 자세히 설명한다.
          • 실행 결과에 대한 로그는 /var/log/cron에 저장된다.
        • 예약 작업을 추가/제거하려면 /usr/bin/crontab이라는 명령어를 사용하면 된다.
          • 예약 작업은 관리자와 일반 사용자 모두 추가할 수 있는데, 보안상의 문제로 인해 여기서는 일반 사용자는 이 기능을 사용하지 못하게 한다.  즉, 관리자만 예약 실행 기능을 사용하도록 한다.
            • chmod  700  /usr/bin/crontab ↙     디스크를 꽉차게 만들 수 있는 보안상의 헛점을 예방하기 위해 실행 권한을 제한한다.
          • 또한 각 실행 스크립트의 접근 권한을 관리자에게만 허락한다.
            • chmod 700 /etc/cron.hourly/* ↙
            • chmod 700 /etc/cron.daily/* ↙
            • chmod 700 /etc/cron.weekly/* ↙
            • chmod 700 /etc/cron.monthly/* ↙
          • crontab 명령어의 사용법은 다음과 같다.
            • crontab -u  USERNAME  FILENAME ↙    파일내용을 지정된 사용자의 예약 작업으로 등록시킨다.
            • crontab -u  USERNAME  OPTION ↙    지정된 사용자의 예약 작업을 다룬다.  옵션은 -l, -r, -e가 올 수 있다.
            • crontab FILENAME ↙    파일 내용을 관리자(root) 권한의 예약 작업으로 등록한다.  단, 파일은 crontab형식에 맞게 작성되어 있어야 한다.
            • crontab -l ↙    관리자(root)에 의해 등록된 예약 작업을 확인한다.  /var/spool/cron/root로 저장된다.
            • crontab -r ↙    관리자(root)에 의해 등록된 예약 작업을 제거한다.
            • crontab -e ↙    관리자(root)에 의해 등록된 예약 작업을 편집한다.
          • crontab 설정파일 형식
            • 1개의 예약 작업은 1개 라인으로써 5개의 날짜필드와 2개의 명령필드로 구성되어 있다.
            • <MM> <HH> <DD> <mm> <d> [permission] <command>
              • MM : 분 (0분~59분)
              • HH : 시 (0시~23시)
              • DD : 날짜 (1일~31일)
              • mm : 달 (1월~12월)
              • d : 요일 (0~7, 0과 7은 일요일을 나타냄)
              • permission : 명령어를 실행할 사용자명을 기록해 준다.  /etc/cron.d에 넣는 경우에는 이 부분이 반드시 있어야 한다.
              • command : 실행할 명령어.
            • 시간을 나타내는 각 필드에서 와일드 카드(*)는 모든 시간을 의미하며, 불규칙한 여러시간에 걸쳐 실행될 경우에는 콤마(,)로 나타낼 수 있다.  또한 연속적인 여러시간은 하이픈(-)을 사용하고 띄엄띄엄 '격'으로 사용할 경우 슬래쉬(/)를 사용한다.
              • 즉, 요일을 예로 들어 보면, 일주일 내내 실행할 경우에는 *를 사용하면 되고, 월요일과 금요일만 실행할 경우 1,5라고 입력하면 된다.  그리고 월요일부터 수요일까지 실행해야 하는 경우라면 1-3라고 입력하면 되고, 월요일부터 금요일까지 2일에 한번씩 실행해야 하는 경우라면 1-5/2 라고 입력하면 된다.
            • crontab 설정파일의 위치는 다음과 같다.
              • 관리자용 예약 작업 내역 : /etc/crontab 파일과 /etc/cron.d 디렉토리.
              • 일반 사용자용 예약 작업 내역 : /var/spool/cron/ 디렉토리. (이 아래에서 '사용자명'으로 파일을 만들어 사용한다.)
          • /usr/bin/crontab 파일의 사용 권한 설정
            • 이미 앞에서 permission을 변경해 주었기 때문에 큰 의미는 없지만 알고는 있어야 하므로 내용을 파악함.
            • 사용 권한은 허가 파일과 거부 파일을 사용해서 제어한다.
              • /etc/cron.allow : 허가목록.  이 파일에 등록된 사용자만 crontab 사용이 가능하다.
              • /etc/cron.deny : 거부목록.  이 파일에 등록된 사용자는 crontab 사용이 불가능하다.
              • 각 파일의 한 라인은 한 명씩의 사용자 이름을 기록하면 된다.
            • 만약 두 개의 파일 모두 없다면 모든 사용자가 사용 가능하다.
            • 두 파일 모두 존재한다면 crontab은 cron.deny의 내용을 무시하고 cron.allow에 등록된 내용을 우선 적용한다.
            • cron.deny만 존재하면 여기에 등록된 사용자만 제외하고 나머지 모든 사용자가 crontab을 사용할 수 있다.
            • cron.allow만 존재하는 경우는 이 파일에 등록된 사용자만 crontab을 사용할 수 있다.
            • root사용자는 위의 두 파일에 영향을 받지 않는다.
        • /etc/crontab 파일 분석
          • SHELL=/bin/bash ↙    시스템이 사용할 쉘의 종류.
          • PATH=/sbin:/bin:/usr/sbin:/usr/bin ↙    실행파일을 찾을 경로 설정.
          • MAILTO=root ↙     예약 작업의 실행 결과를 뒤에 명시된 메일 주소로 보내줌.  메일주소를 비워두면 보내지 않음.
          • HOME=/ ↙    명령을 실행할 때 사용할 홈디렉토리 경로.
          •  ↙
          • # run-parts ↙    주석.
          • 01 * * * * root run-parts /etc/cron.hourly ↙   매 시간 1분에 실행.
          • 02 4 * * * root run-parts /etc/cron.daily ↙     매일 4시 2분에 실행.
          • 22 4 * * 0 root run-parts /etc/cron.weekly ↙    매주 일요일 4시 22분에 실행.
          • 42 4 1 * * root run-parts /etc/cron.monthly ↙    매월 1일 4시 42분에 실행.
          • 이 파일은 root권한으로 /usr/bin/run-parts라는 스크립트를 실행하도록 설정되어 있다.
          • 이 스크립트는 뒤에 명시되는 디렉토리에 있는 실행파일들을 모두 실행시킨다. (물론 각종 백업 파일을 제외한...)
          • cron.hourly, cron.daily, cron.weekly, cron.monthly에 들어가는 스크립트는 일반적인 스크립트들이다.  cron.d에 crontab형식의 파일이 들어가는 것과는 차이가 있다.
            • 기본적으로 들어가 있는 스크립트는 다음과 같다.
            • makewhatis.cron : whatis DB 갱신. 매일, 매주 실행하도록 설정되어 있음.  makewhatis는 root만 실행할 수 있다.
              • whatis DB는 "/var/cache/man/whatis" 파일에 저장된다.
              • whatis는 지정된 명령어의 간략한 설명을 whatis DB에서 찾아 보여주는 것으로, 말 그대로 해당 명령어가 무엇인지를 알려주는 것이다.  세부적인 사용법은 man page를 참고해야 한다.
            • rpm : 현재 설치되어 있는 패키지의 목록을 /var/log/rpmpkgs 파일로 만들어 준다.  매일 실행되도록 설정되어 있다.
              • 이 파일은 실수 또는 이상작동으로 인해 rpmdb가 날아갔거나 시스템이 일부 손상되었을 때 rpm 패키지들 또는 DB를 손쉽게 복구할 수 있도록 해 준다.
              • RPM 패키지 전체 다시 설치 : rpm -Uvh --nodeps --force `cat /var/log/rpmpkgs` ↙
              • RPM 데이터베이스 복구 : rpm -Uvh --nodeps --force --justdb `cat /var/log/rpmpkgs` ↙
            • yum : 먼저 yum을 업데이트하고 나서 전체 시스템의 패키지를 업데이트 한다.  매일 실행되도록 설정되어 있다.
              • 단, 이러한 업데이트는 /var/lock/subsys/yum 파일이 있을 때만 실행되지만 현 상태에는 이 파일이 없어 업데이트가 되지 않는다.  만약 이 파일을 만들어 업데이트를 하고 싶으면 "/sbin/service yum start"를 실행해 주거나 부팅시에 실행될 수 있도록 원하는 런레벨에 "S??yum"으로 넣어 주면 된다.  (영 귀찮으면 직접 touch해도 된다.)
          • 그리고 만약 1분 단위로 실행하고 싶으면 매 시간 실행하는 스크립트 내부에 1분씩 sleep을 주고 1시간 이내로 loop를 사용해 명령을 넣으면 된다.  더 나아가 1초 단위로 프로그램을 실행하고 싶으면 sleep을 1초 단위로 주고 1시간 이내로 loop를 실행하면 된다.
        • /etc/cron.d 디렉토리
          • 만약 매 시간, 매일, 매주, 매월 단위로 실행되는 스케쥴이 아니라 특정시간에 수행하는 경우라면 /etc/cron.d에 crontab파일 형식으로 파일을 만들어 넣어두면 된다.
          • 예)
            • 30 3 * * mon cat /proc/meminfo >> /tmp/meminfo ↙
            • 10 4 1 * * /root/scripts/backup.sh ↙
      • anacron 설정
        • 프로그램을 설치하면 /etc/rc.d/init.d/anacron가 설치되고,  런레벨 2, 3, 4, 5에서 실행되도록 설정된다.
          • 우선은 설치 후 부팅 과정을 거치지 않았기 때문에 anacron을 수동으로 작동시켜야 한다.
            • /etc/rc.d/init.d/anacron start ↙
          • 이 프로그램은 "/var/spool/anacron/TIMESTAMP"에 실행 내역이 기재되어 있지 않거나 명령실행 주기를 넘어선 예약 작업이 있다면 해당 명령을 실행시켜준다.  이는 전원이 꺼져 있어서 실행되지 못한 예약작업이 있을 경우 부팅하면 일정 시간 후 자동으로 실행하도록 할 수 있기 때문에 24시간 켜져 있지 않는 컴퓨터에 유용하게 사용될 수 있다.
          • Anacron 데몬은 부팅시 한번만 실행된 후 종료되며, 설정파일과 timestamp 파일 내용을 확인하여 예약 작업 실행여부를 판단한다.
          • 역시 로그는 cron과 같은 /var/log/cron에 남겨진다.
        • 예약 작업 추가/제거 방법
          • '/etc/anacrontab'에 설정 내용이 담겨져 있다.  예약 작업을 추가/제거하기 위해서는 이 파일을 직접 편집해야 한다.
          • 1개의 예약작업은 1개의 라인으로써 4개의 필드로 구성되어 있다.
          • <period> <delay> <job-identifier> <command>
            • period : 명령 실행 주기 (하루 단위).
            • delay : 지연 실행 시간 (분 단위).
            • job-identifier : Anacron 메시지에서 작업의 타임스탬프 파일로서 사용되는 작업 식별자. 공백, 슬래시 사용금지.
            • command : 실행할 명령어.
          • Anacron은 현재 날짜로부터 최근의 명령 실행 주기(period) 이내에 명령어가 실행되었는지 확인하고, 만약 실행되지 않았으면 지연시간(delay)만큼 기다렸다가 command를 실행한다.
          • 예약 작업이 완료되면 "/var/spool/anacron/<job-identifier>" 파일(=timestamp file)에 시간을 제외한 날짜를 기록한다.
          • 레드햇/페도라에서는 기본적으로 cron의 매일/매주/매월 실행되는 내용이 제대로 실행되었는지 확인하도록 설정되어 있다.
            • 이 때문에 /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly 에는 각 타임스탬프 파일에 실행 내용 기록을 업데이트하는 0anacron 파일이 존재한다. (단, 예약 작업을 중복실행하지는 않는다)
      • at 설정
        • 프로그램을 설치하면 /etc/rc.d/init.d/atd가 설치되고,  런레벨 3, 4, 5에서 실행되도록 설정된다.
          • 우선은 설치 후 부팅 과정을 거치지 않았기 때문에 atd를 수동으로 작동시켜야 한다.
            • /etc/rc.d/init.d/atd start ↙
          • Atd는 지정된 작업을 queue에 넣는데, 이 queue는 /var/spool/at 디렉토리 아래에 파일로 만들어진다.  그리고 매분 큐를 확인해서 지정된 시간이 되었다면 실행을 하고, 실행결과는 사용자의 메일로 전송한다.  그리고 실행완료된 예약 작업은 큐에서 제거된다.
        • 예약 작업 추가/제거 방법
          • 예약 작업 추가하기
            • at  <시간> ↙    지정된 시간에 아래에서와 같이 표준입력으로 입력되는 내용들을 실행한다.
              • at> ...명령어 입력... ↙    "at>" 프롬프트가 뜨면 실행할 명령어들을 입력한다.
              • at> ctrl + d ↙    명령어들의 입력이 끝나면 ^D를 눌러 해당 내용을 저장한다.
            • at <시간> -f <파일명> -m -q t ↙    지정된 시간에 실행된 작업을 직접 입력하지 않고 지정된 파일에서 읽어오고(-f),
              • 실행결과를 실행한 사용자의 메일로 알려준다(-m).
              • 그리고 "t"라는 queue에 작업을 넣는다(-q t).  참고로 사용가능한 큐는 a-z, A-Z까지이고, 별도로 지정되지 않으면 a를 기본 큐로 사용한다.  그리고 특히 b는 batch명령(시간에 관계없이 CPU사용률에 따른 예약 실행을 하는 명령어)에서 사용되는 큐이며 나머지 큐들은 뒷쪽의 문자를 사용할수록 nice값을 높여서 실행한다.
          • 예약 작업 목록 보기
            • atq ↙    큐에 저장된 작업들을 보여준다. (보여지는 정보는 '작업번호', '작업예정시간', '작업이 저장되어 있는 큐'이다.)
            • at -l ↙    atq와 동일한 기능을 하는 명령어.
            • at -c ↙   단순한 예약 작업 목록 뿐만 아니라 at프롬프트에서 입력했던 명령어까지 같이 보여준다.
            • 작업목록을 보는 명령어는 root인 경우에는 모든 작업들의 목록을 보여준다.
          • 예약 작업 삭제하기
            • atrm <작업번호> ↙    지정된 예약 작업을 큐에서 삭제한다.
            • at -d <작업번호> ↙    atrm과 동일한 기능을 하는 명령어.
          • 시간 표기법
            • at명령어에 사용할 수 있는 <시간>의 형식은 기본적으로 "hh:mm YYYY-MM-DD"로 적는다.
            • "hh:mm"은 시간으로 24시간제를 기본으로 한다.  만약 am, pm을 뒤에 붙여주면 12시간제로 사용할 수 있다.  만일 시간이 이미 지났으면, 다음날 지정된 시간에 작업을 실행한다.
              • 그 외에 다음과 같은 단어를 사용해서 시간을 표현할 수도 있다.
                • now : 현재 시각.
                • midnight : 00:00 = 12:00AM.
                • noon : 12:00PM.
                • teatime : 16:00 = 4:00PM.
              • 시간에 증가 설정을 사용할 수도 있다.
                • 형식은 "시간+증가시간"인데 증가시간의 표기는 다음과 같다.
                • +10minute(10분 후) , +1hour(1시간 후), +3hours(3시간 후), +5days(5일 후).
            • "YYYY-MM-DD"은 년월일을 의미한다.
              • 다음과 같은 형식으로 사용되기도 한다.
              • "month-name day year" : 예를 들어 January 15 2002.  년도는 생략가능.
              • "MMDDYY", "MM/DD/YY" 또는 "MM.DD.YY" : 예를 들어 011502는 2002년 1월 15일.
              • today(오늘), tomorrow(내일).
        • 권한설정
          • at 명령어를 사용할 수 있는 사용자를 제한하기 위해 /etc/at.allow(허가목록)와 /etc/at.deny(거부목록)을 사용한다.
          • 파일 내용의 1줄이 사용자 1명을 의미하고 내용은 '사용자명'을 기록하면 된다.  빈줄은 넣을 수 없다.
          • 만약 이 파일들이 수정되더라도 atd를 다시 실행할 필요는 없다.  at명령어가 실행될 때 마다 이 파일들을 참고하기 때문이다.
          • at.allow와 at.deny는 보통 둘 중 하나만 사용되지만 2개 모두 있는 경우도 있다.
          • 각 경우의 사용자 허용 범위를 살펴 보면 다음과 같다.
            • /etc/at.deny 만 존재 : 기본적으로 모든사용자가 사용가능하고 at.deny 에 등록된 사용자만 사용불가.
            • /etc/at.allow 만 존재 : at.allow 파일에 등록된 사용자만 사용가능.
            • 두 파일 모두 없을 때 : 일반사용자는 불가능하고 root만 사용가능.
            • 두 파일 모두 있을 때 : at.deny 내용을 무시하고 at.allow 나타난 사용자만 사용가능.

 

    • 예약 실행기능 등록
      • 여기에서는 crond를 이용해 정기적으로 시간 동기화와 DDNS update를 하도록 설정한다.
      • 시간 동기화
        • 시간은 여러 가지 이유로 틀려질 수 있는데 사용자가 접속하지 않는 서버인 경우에는 크게 문제가 없지만 여러사용자가 접속하는 서버인 경우에는 문제가 된다.
        • 가장 대표적인 예가 데이터베이스인데, DB 트랜잭션 처리시에 시간이 엉켜 버리면 입력되는 데이터도 엉망이 되어 버리므로 반드시 시간 동기화 문제는 해결해야 한다.
        • 여기서는 하루 단위로 시간 동기화를 한다.
        • 우선 timezone을 위한 설정을 완료해 준다.
          • /etc/sysconfig/clock 파일을 작성한다. (파일 링크 : clock )
            • cat > /etc/sysconfig/clock ↙
            • ZONE="Asia/Seoul" ↙
            • ctrl + d ↙
          • /etc/profile에 TZ 변수도 설정해 준다. (파일 링크 : profile )
            • export TZ=/usr/share/zoneinfo/ROK ↙
        • 시간 동기화에 사용할 스크립트 제작해서 "/etc/cron.daily/" 에 넣는다. (파일 링크 : sync_time )
          • 이 스크립트는 타임서버에서 시간을 읽어와 ±30분의 오차를 넘어서면 시간을 변경하지 않는다.  
            • 예전에 타임서버가 1970년으로 잘못 초기화되어 여러 사이트들의 DB가 엉키는 사태가 벌어진 적이 있었기 때문에 이런 조치를 취한다.
          • 두 대의 타임서버를 지정하여, 첫 번째 타임서버에서 동기화를 실패할 경우 두 번째 타임서버로 동기화 할 수 있도록 하였다.
          • #!/bin/bash ↙
          •  ↙
          • TIMESERVER1="time.bora.net" ↙     첫 번째 타임서버 지정.
          • TIMESERVER2="time.nist.gov" ↙      두 번째 타임서버 지정.
          •  ↙
          • PAST_TIME=`date --date '30 minutes ago' +%Y%m%d%H%M%S` ↙     오류확인 시각으로 사용할 -30분 시각 지정.
          • FUTURE_TIME=`date --date '30 minutes' +%Y%m%d%H%M%S` ↙        오류확인 시각으로 사용할 +30분 시각 지정.
          • NEW_TIME=`rdate -p $TIMESERVER1` ↙    첫 번째 타임서버에서 시각을 읽어옴.
          • if [ $? == 0 ]; then ↙     만약 오류 없이 시각을 가져왔다면...
          •         TIMESERVER=$TIMESERVER1 ↙      첫 번째 타임서버를 시각설정 서버로 지정.
          • else ↙     만약 오류가 있다면....
          •         NEW_TIME=`rdate -p $TIMESERVER2` ↙     두 번째 타임서버에서 시각을 읽어옴.
          •         if [ $? != 0 ]; then ↙     두 번째 타임서버에서도 오류가 발생했다면...
          •                 echo "($NEW_TIME) Sync time : Error" >> /var/log/sync_time.log ↙    오류 메시지를 발생시킴.
          •                 exit 1 ↙   스크립트를 종료시킴.
          •         fi ↙
          •         TIMESERVER=$TIMESERVER2 ↙     만약 오류없이 두 번째 타임서버에서 시각을 읽어왔다면 시각설정 서버로 지정.
          • fi ↙
          • NUM_YEAR=`echo $NEW_TIME | awk '{ print $7 }'` ↙     서버에서 가져온 시각에서 년도 분리.
          • NUM_MONTH=`echo $NEW_TIME | awk '{ print $4 }'` ↙   서버에서 가져온 시각에서 월 분리.
          • case "$NUM_MONTH" in ↙     분리한 월을 숫자로 변환.
          •         Jan) NUM_MONTH="01" ;; ↙
          •         Feb) NUM_MONTH="02" ;; ↙
          •         Mar) NUM_MONTH="03" ;; ↙
          •         Apr) NUM_MONTH="04" ;; ↙
          •         May) NUM_MONTH="05" ;; ↙
          •         Jun) NUM_MONTH="06" ;; ↙
          •         Jul) NUM_MONTH="07" ;; ↙
          •         Aug) NUM_MONTH="08" ;; ↙
          •         Sep) NUM_MONTH="09" ;; ↙
          •         Oct) NUM_MONTH="10" ;; ↙
          •         Nov) NUM_MONTH="11" ;; ↙
          •         Dec) NUM_MONTH="12" ;; ↙
          • esac ↙
          • NUM_DAY=`echo $NEW_TIME | awk '{ print $5 }'` ↙     서버에서 가져온 시각에서 날짜 분리.
          • if [ $NUM_DAY -lt 10 ]; then ↙    만약 서버에서 가져온 날짜가 10보다 작은 한자리 수라면...
          •         NUM_DAY=`echo 0$NUM_DAY` ↙      앞에 0을 덧붙인다.   즉, 시간 오차확인에 사용할 수 있도록 형식을 통일해 준다.
          • fi ↙
          • NUM_TIME=`echo $NEW_TIME | awk '{ print $6 }' | awk -F : '{ print $1 $2 $3 }'` ↙     서버에서 가져온 시각에서 시간부분만 분리.
          • NEW_TIME=`echo $NUM_YEAR$NUM_MONTH$NUM_DAY$NUM_TIME` ↙     분리했던 내용들을 숫자 형태로 합침.
          • if [ $NEW_TIME -gt $PAST_TIME ] && [ $NEW_TIME -lt $FUTURE_TIME ]; then ↙      서버에서 읽어온 시각이 ±30분 이내인지 확인.
          •         sleep 1 ↙      타임서버에서 해킹 시도로 오인하는 것을 방지하기 위해 1초간 쉼.
          •         /usr/bin/rdate -s -p $TIMESERVER ↙     확인된 타임서버에서 시각을 읽어와 시스템 시각으로 설정함.
          •         [ "$?" -eq 0 ] && /sbin/clock -w ↙          시스템 시각을 하드웨어 시각으로 설정함.
          • fi ↙
          • echo "($NEW_TIME) Sync Time : OK" >> /var/log/sync_time.log  ↙     정상적으로 수행했음을 알림.
          • rdate는 RFC868에서 정의한 TCP/UDP 37번 포트를 사용, NTP는 SNTP 프로토콜에서 정의한 TCP/UDP 123번 포트를 사용한다.
          • rdate의 경우 서버는 'time-tcp'(TCP daemon), 'time-udp'(UDP daemon)를 사용하고 client는 rdate를 사용한다.
          • rdate로 서버에 접속하면 서버는 32비트의 바이너리 숫자를 보내주고 접속을 끊는다.  이 숫자는 1900년 1월 1일 0시 0분 0초를 기준으로 현재까지의 시간을 '초' 단위로 환산한 값이다.  (프로그래밊을 할 때는 C가 1970년부터 계산하므로 그 차이값을 빼주고 계산해야 한다.)
          • 참고로 좀 더 정밀한 시간 설정을 위해서는 NTP(Network Time Protocol)의 ntpdate를 사용하면 된다.  
          • NTP는 계층적 구조를 가지고 있어서 체계적이고 정확한 동기화가 가능하다.  Server는 ntpd를 사용하고, client는 ntpdate를 사용한다.
        • 추가적으로 rc.local의 부팅시 시간 동기화 부분을 여기에서 작성한 스크립트를 사용하도록 수정한다. (파일 링크 : rc.local )
          • ......
          • sleep 2 ↙
          • /etc/cron.daily/sync_time ↙
          • ......

 

    • DDNS update
      • 여기에서는 유동 IP를 이용하는 서버를 외부에서도 접근할 수 있도록 하기 위해서 dynmic DNS를 사용한다.
      • 대표적인 서비스 제공 사이트로는 www.dyndns.org가 있다.
      • 이 사이트에 가입하고 1시간 단위로 유동 IP를 업데이트 해 줌으로써 안정적인 domain name을 무료로 사용하도록 한다.
      • 참고로 dyndns에서는 35일 이상 ip를 업데이트하지 않으면 domain name을 삭제한다.  고정IP 대상의 서비스는 유료이다.
      • Update 스크립트는 dyndns에서 공식 추천하는 스크립트를 사용한다.  (링크 : http://ddclient.sourceforge.net/index.php?page=main  )
      • 스크립트 프로그램 설치
        • tar  xvjf  ddclient-3.6.7.tar.bz2 ↙
        • cd ddclient-3.6.7 ↙
        • chmod 700 ddclient ↙    보안을 위해 접근을 제한한다.
        • cp ddclient /usr/sbin ↙    스크립트 프로그램을 복사한다.
        • mkdir /etc/ddclient ↙    설정파일 디렉토리를 만든다.
      • ddclient 설정 파일 제작 (파일 링크 : ddclient.conf )
        • cat >  /etc/ddclient/ddclient.conf ↙    설정파일을 작성한다.
        • syslog=yes ↙     로그파일(/var/log/messgaes)에 로그를 남긴다.
        • mail=root ↙     정상 종료시 실행 결과를 root에게 메일로 보낸다.
        • mail-failure=root ↙    오류 발생시 실행 결과를 root에게 메일로 보낸다.
        • pid=/var/run/ddclient.pid ↙     Daemon으로 실행할 때 Process ID를 지정된 파일에 저장한다.
        • use=web, web=checkip.dyndns.org/, web-skip='IP Address' ↙     현재 자신이 부여받은 IP를 web으로 확인한다.
        • login=chogory ↙     Dyndns의 ID.
        • password=<removed> ↙     Dyndns의 비밀번호.
        • server=members.dyndns.org \ ↙     Dyndns를 사용할 서버.
        • protocol=dyndns2 \ ↙     Dyndns에서 사용할 프로토콜.
        • chogory.mine.nu ↙     사용할 domain name.
        • ctrl + d ↙
        • chmod 600 /etc/ddclient/ddclient.conf ↙    보안을 위해 접근을 제한한다.
      • 정기적으로 업데이트되도록 crontab에 등록 (파일 링크 : ddns_update )
        • cat > /etc/cron.hourly/ddns_update ↙
        • #!/bin/bash ↙
        • /usr/sbin/ddclient  -quiet  -force ↙
          • 참고 : -queit (화면에 아무것도 출력하지 않는다.  반대로 상세 출력은 -verbose), -force (update가 필요없는 상황이더라도 update를 강행한다).
        • ctrl + d ↙
        • chmod 700 /etc/cron.hourly/ddns_update ↙
        • ddclient 독립적으로 daemon 방식의 운영이 가능하지만 이렇게 하면 ddclient가 계속 가동되는 문제점이 있다.  
        • 이는 자원점유율과 보안 위협 측면에서 크게 바람직하지는 않으므로, 이 글에서는 daemon보다는 cron을 이용한 순간적인 실행이 되도록 설정했다.



출처 - http://community.365managed.com/?document_srl=936








crontab 이란?
서버 스스로 정해둔 명령을 일정 기간마다 실행하도록 하는 것입니다.

사용형식

crontab [ -u 사용자 id] 파일
crontab [-u 사용자 id] { -l | -r | -e}

# crontab -l : 예약된 작업리스트
# crontab -e : 예약된 작업 수정
# crontab -r : 예약된 작업 삭제

cron 실행 확인
# ps -ef | grep crond

cron 시작
# /etc/init.d/cron start{restart | stop}

일반사용자에게 crontab 명령어 사용하도록 설정 허가
/etc/cron.allow 여기에 ID 등록

일반사용자의 crontab 명령어사용을 제한
/etc/cron.deny  에 ID를 등록

등록 내용 설정
"분,시,일,월,요일, 실행명령" 순으로 설정

crontab 파일 형식
------    --------  ---------------------------------------------------
필  드    의  미    범  위
------    --------  ---------------------------------------------------
첫번째    분        0-59
두번째    시        0-23
세번째    일        0-31
네번째    월        1-12
다섯번째  요일      0-7 (0 또는 7=일요일, 1=월, 2=화,...)
여섯번째  명령어    실행할 명령을 한줄로 쓴다.
------    --------  ---------------------------------------------------

- 한 줄당 하나의 명령 (두줄로 나눠서 표시할 수 없음)
- # 으로 시작하는 줄은 실행하지 않는다 (주석)


/etc 에 아래 특정 폴더를 등록해 놓으면 그 폴더안의 실행 파일을 crontab의 설정 시간 마다 실행 
특정폴더: /etc/cron.hourly   /etc/cron.daily   /etc/cron.weekly   /etc/cron.monthly 


$ crontab -e
# /home 디렉토리를 /BACKUP/home 으로 백업해둠
# 30분, 새벽 4시와 낮 12시, 모든 일, 모든 월, 모든 요일 
30 4,12 * * *  /usr/bin/rsync -avxH --delete /home /BACKUP/home > /dev/null 2>&1

 # 파일/디렉토리 퍼미션 설정
 # 40분, 새벽 1시, 매주 일요일
40 1    * * 0  /root/bin/perm_set.sh   > /dev/null 2>&1

 # 20분마다 실행

 */20 * * * * /shell/mrtg

위는 매일 4:30분과 12:30분에 rsync 명령을, 매주 일요일 1:40분에 perm_set.sh를 실행함을 의미한다.


설정 예

시간 설정에서 몇가지 의미있는 것들을 알아보자.

- '*'표시는 해당 필드의 모든 시간을 의미한다.
- 3,5,7 와 같이 콤마(,)로 구분하여 여러 시간대를 지정할 수 있다.
- 2-10와 같이 하이픈(-)으로 시간 범위도 지정할 수 있다.
- 2-10/3와 같이 하이픈(-)으로 시간 범위를 슬래쉬(/)로 시간 간격을 지정할 수 있다.
  (2~10까지 3간격으로. 즉, 3,6,9를 의미함)

=>  > /dev/null  2>&1 이 무슨 뜻입니까?
  지정한 명령어 처리 결과와 발생할지 모르는 에러메시지를 출력하지 않고 모두 버린다는(/dev/null)는
  뜻입니다. 만약 결과와 에러를 파일로 저장하려면 /dev/null 대신 파일명을 적어주면 됩니다.

예)
20 2 * * 6 명령어 => 매주 토요일 새벽 2:20
0 4-6 * * * 명령어 => 매일 오후 4,5,6시
5 */2 * * * 명령어 => 매일 2시간간격으로 5분대에
15 1 1 * * 명령어 => 매월 1일 새벽 1:15
30 0 1 1,7 * 명령어 => 1,7월 1일 새벽 0:30

10 2 * * * /app11/minsang/APP/ldap/run.sh > /app11/minsang/APP/ldap/cron_error.log
55 13 * * * /run.sh > /mail_cron_error.log
0,30 8-19 * * * /sendAdmin.sh > /cron_admin_error.log


출처 -  http://hninja.tistory.com/75







Administration Guide Draft/Cron

Contents

 [hide

Scheduling Tasks

Introduction

Fedora provides a cron facility for tasks scheduling. The cron facility is most commonly used for routine system maintenance and other recurring tasks, such as execution of backup scripts at pre-determined intervals. Thecron utility runs as a crond daemon and executes tasks specified in the system or master crontab file - /etc/crontab or users' crontab files which, once created, are installed in the /var/spool/cron directory.

System crontab File

The master crontab file consists of seven fields, in the following order:

FieldMeaningValid value
1Minute0-59
2Hour0-23
3Day of Month1-31
4Month1-12 or jan,feb,mar,etc.
5Day of Week0-7 or sun,mon,tue,etc; where 0 and 7 = Sunday, 1 = Monday...
6username to run the task asAny valid userID on the system
7Task to runAny program found in the PATH which user in the Field 6 has the right to execute
Idea.png
If used, the * symbol in the first five fields represents all valid values for the field.

As specified in the Fedora's default /etc/crontab file:

cat /etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

...cron executes run-parts utility which processes all jobs found in /etc/cron.weekly directory, on every Sunday at 04:22.

The top section of the /etc/crontab file is optional and contains the lines which will set the environment variables for the jobs specified in the bottom section of the file. If these variables are not specified, the environment of the user in field 6 is used.

To add additional jobs to the system cron, place them in the /etc/cron.d directory.

User crontab Files

Use the crontab utility to edit, install, remove or view individual user's task schedules.

crontab Usage

Usage:

crontab <filename>

In the example above, the content of the file <filename> must conform to the crontab syntax. The only difference from the system crontab file is that the user crontab files do not contain user field. If the <filename>conforms to the crontab syntax, the crontab file of the user who runs the command will be installed in /var/spool/cron directory, with the user's name as a file name, i.e., if user root runs the command, the crontab file is created as /var/spool/cron/root.

User crontab files are not directly accessible to users, since the /var/spool/cron directory has 700 permissions set. To edit one's own crontab file the user must run the crontab command with an -e option:

crontab -e

The crontab -e may also be used to create the new crontab file. When executed, crontab -e opens the existing or new crontab file in the vim text editor. The altered crontab file is installed once it is written using :woption in vim.

To read the content of the crontab file, run:

crontab -l

To remove the crontab file, run:

crontab -r

To read or manipulate the other user's crontab file, as root run:

crontab -u <username> [options] 

To control which users can run crontab, use the /etc/cron.allow and /etc/cron.deny files. The rules are:

  • If the file /etc/cron.allow exists, add to it the username of the user to grant the access
  • If the file /etc/cron.deny exists, it must not contain the username of the user who needs access to the cron
  • If neither the /etc/cron.allow nor /etc/cron.deny exists, only the root user has access to the cron

Anacron

The anacron utility can be used to periodically schedule jobs on the machines which do not run 24 hours per day. The anacron is controlled by the /etc/anacrontab file. The /etc/anacrontab file has a syntax similar to the/etc/crontab. It consists of two sections:

  • Environment assignments section - where environment variables such as SHELLPATH or MAILTO for the scheduled jobs are set
  • Job description section - where the actual jobs are scheduled

The job description section contains one or more lines, each consisting of four fields, separated by one or more blank space. The four fields are:

FieldMeaningValid value
1Periodn number of days
2Delayn number of minutes
3Job IdentifierAny non-blank character, except /
4Command to runAny shell command

The default /etc/anacrontab file on Fedora:

cat /etc/anacrontab


SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

1        65     cron.daily              nice run-parts /etc/cron.daily
7        70     cron.weekly             nice run-parts /etc/cron.weekly
@monthly 75     cron.monthly            nice run-parts /etc/cron.monthly

...executes the run-parts on all jobs from /etc/cron.weekly directory if it has not run in the last 7 days. run-parts will run with the delay of 70 minutes upon the start of the anacron daemon and use cron.weekly as an identifier for this job in anacron messages.

Additional Information

Related Manuals

Find more information about cron and anacron from the following man pages:

  • cron(8)
  • crontab(1)
  • crontab(5)
  • anacron(8)
  • anacrontab(5)



출처 - http://fedoraproject.org/wiki/Administration_Guide_Draft/Cron



'System > Linux' 카테고리의 다른 글

linux - D-Bus  (0) 2013.08.30
linux - fedora repair filesystem  (0) 2013.08.30
linux - watch and grep  (0) 2013.07.12
linux - Running Additional Programs at Boot Time  (0) 2013.07.02
linux - remmina 소개(remote desktop for linux)  (0) 2013.06.15
Posted by linuxism
,