크롤링을 위해 crontab을 써야할 일이 생겼는데, 재배포의 효율성을 높이고 서버의 설정을 코드로 관리하기 위해 관련된 내용을 공부해봤다.
crontab이란?
소프트웨어 유틸리티 cron은 유닉스 계열 컴퓨터 운영 체제의 시간 기반 잡 스케줄러이다. 소프트웨어 환경을 설정하고 관리하는 사람들은 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케줄링하기 위해 cron을 사용한다.
출처 위키백과 : https://ko.wikipedia.org/wiki/Cron
이때 crontab은 cron table에 줄임말로 cron의 명세를 해놓은 파일이다.
crontab 사용하기
crontab -e # crontab 편집
crontab -l # crontab 내용 보기
crontab -r # crontab 삭제
crontab -e 명령으로 편집 창을 열고 아래와 같은 양식으로 실행할 명령을 한줄씩 띄워서 작성할 수 있다.
* * * * * <실행명령>
*은 앞에서부터 분, 시, 일, 월, 요일 을 의미한다. 예를들어
0 15 1,8,15,22 * * sh /home/ubuntu/test-1.sh
0 19 */2 * * sh /home/ubuntu/test-2.sh
이렇게 설정을 한다면 첫번째 줄은
매달 요일과 관계없이 1,8,15,22일 15시 00분에 test-1.sh 쉘 스크립트를 실행하라는 의미고,
두번째 줄은
매달 요일과 관계없이 이틀에 한번씩 19시 00분에 test-2.sh 쉘 스크립트를 실행하라는 의미다.
설정한 값은 crontab -l을 통해 확인할 수 있고, crontab -r로 초기화할 수 있다.
Shell Script로 crontab 설정하기
매번 crontab -e로 같은 명령어를 입력하기보다 shell script로 관리하면, git으로 코드 관리가 가능하고 공유도 쉽다.
# crontab-setting.sh
#!/bin/bash
(crontab -l 2>/dev/null; echo "0 15 1,8,15,22 * * sh /home/ubuntu/test-1.sh >/dev/null 2>&1") | crontab -
(crontab -l 2>/dev/null; echo "0 19 */2 * * sh /home/ubuntu/test-2.sh >/dev/null 2>&1") | crontab -
(crontab -l 2>/dev/null; echo "* * * * * {실행할 명령어} >/dev/null 2>&1") | crontab -
위 형식으로 shell script를 짤 수 있었다. 앞에 crontab -l 2>/dev/null;를 추가해야 덮어 쓰지 않고, 다음 줄에 추가가 된다.
트러블 슈팅
1. (CRON) info (No MTA installed, discarding output)
크론탭을 실행했는데 정상적으로 작동되지 않았다. 시스템 로그에 들어가니 그 이유를 찾을 수 있었다.
cd /var/log
cat syslog
위 명령어로 syslog 파일에 접근해보니 crontab이 실행은 되었으나 오류가 났다.
여기에서 그 이유와 해답을 찾을 수 있었는데
대충 cron이 출력을 사용자에게 email로 보내려해서 생기는 문제인데, 출력을 없애버려서 해결하면 된다고 한다.
2. 실행 path 문제
crontab으로 shell script를 실행하면 shell script가 있는 위치에서 script가 실행되는 것이 아니다.
그렇기에 shell script에 있는 상대경로인 부분을 절대경로로 바꿔줘야 정상적으로 작동하였다.
특히 필자는 shell script에서 한번 더 python 파일을 실행하고 있는 형태였는데, python 파일 내의 경로는 다음과 같은 방법으로 동적인 절대경로? 로 지정해줄 수 있었다.
path = os.path.dirname(os.path.abspath(__file__))