• Home
  • About
    • Tien02 photo

      Tien02

      Moon is a minimal, one column jekyll theme for your blog.

    • Learn More
    • Facebook
    • Instagram
    • Github
  • Posts
    • All Tags
    • DataBase
    • React
    • Linux
    • Review
  • Projects

cron을 통한 주기적 프로세스 실행

23 May 2019

Reading time ~2 minutes

``

cron 명령어

  • 특정 시간에 명령어가 수행 될 수 있도록 예약해주는 리눅스용 작업 Scheduler, Daemon으로 동작하며 Cron table 형식의 예약 스크립트를 작성하도록 되어있다.
  • cron은 기본적으 멀티스레드(task)를 지원하지 않는다. 동시에 다수의 task를 실행시키고 싶다면 아래와 같이 스크립트를 작성하고 이를 cron에 등록한다.
    vi main.sh
    ./etc/rip_first_radio.sh &
    ./etc/rip_second_radio.sh &
    ./etc/rip_third_radio.sh &
    ./etc/rip_fourth_radio.sh &
    
  • & 연산자는 & 앞 명령을 백그라운드로 넘긴다. &&는 앞 명령이 성공적으로 수행된 후에 뒷 명령이 수행된다.

  • 설치

    apt-get install -y cron # 유닉스 계열은 보통 기본적으로 설치 되어있다.
    
  • 사용

    • 옵션

      -e : edit, 예약 스크립트를 수정

      -l : List, 예약된 스크립트 목록을 출력

      -r : Reset, 예약된 스크립트 초기화

    • 옵션 -e로 실행하면 예약스크립트를 수정할 수 있는 에디터가 실행되는데 형식은 다음과 같다.

      crontab -옵션
          
      # Host Timezone을 기준으로 실행된다.
      [분] [시] [일] [월] [요일] [실행할 명령어]
          
      # 월 ~ 금요일 10시 30분에 test.py 실행
      30 10 * * 1-5 python /home/norr/test.py
      # 매월 15일에 10분마다 scan.py 실행
      */10 * 15 * * python /home/norr/scan.py
      
  • 실행 확인

    ps -ef | grep crond
    cat /var/log/syslog # cron log 정보를 볼 수 있다. 우분투 기준 경로이며, os에 따라 다를 수 있다.
    
  • 서비스 시작 및 재부팅

    service cron start
    service cron stop
    service cron restart
    
  • 로그 남기기

    • cron job들은 자동으로 수행되기때문에 별도로 작업로그를 남기지 않으며 해당 작업이 정상적으로 수행되었는지 체크하기가 매우 까다롭다. cron job의 수행 여부 자체는 시스템 로그(우분투는 /var/log/syslog) 남지만, 실제 해당 job이 실행되면서 job에서 발생시키는 로그는 따로 기록이 필요하다. cron job을 등록할 때 아래와 같은 명령어를 사용하면 로그 파일을 남길 수 있다.

      0 0 * * * /some/job > ~/log/job_`date +\%Y\%m\%d\%H\%M\%S`.log 2>&1
      # date 명령어를 이용하면 지정한 포메터 대로 현재 시간을 출력할 수 있다.
      # 쉘 스크립트에서 `문자를 이용하여 명령어를 감싸면 해당 명령어의 stdout을 return해주는데 이를 이용하여 파일 이름을 정해줄 수 있다.
      # 2>&1 의미 : 1은 stdout, 2는 stderr, >는 리다이렉션을 의미한다
      # 즉 stderr를 stdout으로 리디렉션해서 stdout과 동일하게 처리함을 의미한다.
      
    • 리디렉션 기호인 > 를 이용하여 stdout을 파일로 기록하려면 다음과 같이하면 된다.

      # 해당 로그파일에 overwrite 
      /some/job > ~/log/job_`date +\%Y\%m\%d\%H\%M\%S`.log  
          
      # 해당 로그파일의 appedn
      /some/job >> ~/log/job_`date +\%Y\%m\%d\%H\%M\%S`.log  
          
      # 로그 파일 버리기
      /some/job > /dev/null
      
  • 가상환경 키고 파이썬 파일 실행

    SHELL=/bin/bash
    */1 * * * * source ~/AuctionParsing/venv/bin/activate && python3 ~/AuctionParsing/modify_ver1.py > ~/AuctionParsing/cron.log 2>&1
    


linuxcron스케쥴 Share Tweet +1