📌Cron? Crontab?
cron이란? 소프트웨어 유틸리티 중 하나로 컴퓨터 운영체제의 시간을 기반으로 운영되는 잡 스케줄러 중 하나이다. cron은 주어진 일정에 주기적으로 실행되도록 규정해놓은 파일인 crontab(cron table)파일에 의해 구동된다. 장황하게 말하기는 하였지만, 주기적으로 코드가 실행되게 하고싶을 때 활용한다는게 요지이다.
📌설치
cron 설치는 아래와 같이 아주 간단하다. cron을 설치해보자.
apt-get install cron
📌Crontab의 활용
자 이제 crontab을 활용해보자. crontab -h
도움말로 옵션을 확인해보자. 옵션은 크게 수정, 조회, 삭제(-i는 제거 문구 생성)가 있는 것을 확인 할 수 있다.

crontab -l
명령어는 현재 crontab의 목록을 조회할 수 있다.
crontab -l
crontab -e 를 통해 crontab파일을 생성해보자.
crontab파일을 생성하기 전에 주기적으로 실행될 파일을 만들어보자. 해당 파일은 해당 스크립트가 실행된 시간을 chapter3.txt파일에 저장되게하는 코드이다.
Sys.setenv(TZ='Asia/Seoul')
write.table(
data.frame(
time=as.POSIXct(Sys.time(),
tz="Asia/Seoul")),
file='/home/ducj/rstudio/2022/chapter3/chapter3.txt')
🌈파일 주기적 실행
crontab -e
안에 아래와 같이 입력을 하고 sudo service cron restart
명령어로 cron을 재실행하자.
* * * * * /usr/local/bin/Rscript /home/ducj/rstudio/2022/chapter3/crontab_test.R
그러면 주기적으로 실행되는 것을 확인할 수 있다.
🌈여러 파일 주기적 실행
여러 파일을 주기적으로 실행하고 싶은 경우나 지속적 관리를 하고 싶은 경우에는 shell file을 활용할 수 있다. 아래와 같이 shell 파일을 생성해보자.
#!/bin/bash -l
Rscript /home/ducj/rstudio/2022/chapter3/crontab_test.R
crontab -e 옵션을 수행한 다음 * 을 5개 작성하고 shell 파일의 절대경로를 입력해주자. 이는 매 분마다 shell 파일을 실행해 달라는 의미이다.
crontab -e

지속적인 관리를 하고 싶은 경우 sh파일을 ~/.bash_profile에 저장하면 관리가 용이해진다.
🌈참고
☀️ 에러 발생 시 참고
간혹 실행이 되지 않는 경우에는 아래와 같이 chmod +x 명령어를 통해 파일 쓰기 권한을 부여하면 해결된다고 한다.
☀️로그 남기고 싶을 때
아래와 같이 >로 쓰고 싶은 파일 명을 남기면 된다. 아래 코드는 list_update_log_년월일_시분초.log 로 파일이 기록된다.
shell스크립트에서 >는 출력을 의미하며, 0, 1, 2는 각각 표준입력, 출력, 에러를 의미합니다. 따라서 2>&1은 에러를 출력해달라라는 의미입니다.
* * * * * /usr/local/bin/Rscript /home/ducj/rstudio/2022/chapter3/crontab_test.R > /home/ducj/rstudio/2022/chapter3/list_update_log_`date +\%Y\%m\%d`_`date +\%H\%M\%S`.log 2>&1
☀️시간 표기
보기에서 * 5개로 예를 들었지만 정밀하게 시간을 조절 할 수 있다. 각각의 *은 분/시간/일/월/요일을 의미한다. 20분 간격으로 생성하고 싶다면 0,20,40 * * * *
와 같이 콤마로 묶어주면 되며, 특정 기간동안(0~3분) 시간단위(분)로 실행하고 싶다면, 0-3 * * * * *
와 같이 수행할 수 있다.
* * * * *
분(0-59) 시간(0-23) 일(1-31) 월(1-12) 요일(0-7)
☀️중복실행 방지
crontab파일의 실행시간이 crontab 실행주기보다 긴 경우면, 중복실행되어 예상치못한 문제가 발생할 수 있으므로, flock -n
을 통해 이를 방지할 수 있다.
* * * * * /usr/bin/flock -n /tmp/prop.lockfile /home/user/test.sh
☀️백업
crontab 파일을 shell 명령어로 아래와 같이 파일화 시킬 수 있습니다. crontab의 백업도 crontab에서 하면, 좀 더 효율적이겠죠?
crontab -l > /home/bak/crontab_bak.txt
☀️참고 사이트


