백앤드(Back-End)/Ubuntu

[Ubuntu] Crontab(크론탭) 사용법

RyanSin 2021. 8. 11. 16:58
반응형

- 개요

안녕하세요. 이번 시간에는 Crontab에 대해 알아보겠습니다. 

 

크론탭은 스케줄러라고 생각하시면 됩니다.  ("특정 시간에 특정 작업을 한다.")

 

만약 우리는 서버에서 주기적으로 DB에서 데이터를 백업해야 하거나, 특정 시간에 정보를 수정해야 하는 상황이거나

아니면 로그파일 등을 삭제하거나 등등 여러 경우가 있을 겁니다. 

 

이럴 때 Crontab을 사용해서 개발자가 직접 작업하지 않고 특정 시간에 해당 작업을 진행할 수 있습니다.

 

- 사용법

기본적으로 설정 방법은 /etc/crontab 파일 또는 crontab -e 명령어를 통해 스케줄을 등록할 수 있습니다.

 

이번에는 /etc/crontab 파일을 수정해서 진행하도록 하겠습니다.

 

먼저 관리자 권한으로 접근해서 수정해야 합니다.

명령어 : sudo -i

cat 명령어를 통해 crontab 파일을 확인합니다.

명령어 : cat /etc/crontab

기본적으로 설정되어 있는 것들을 확인할 수 있습니다.

 

우리는 해당 파일을 수정해서 스케줄을 등록해보겠습니다.

(혹시 운영체제 시간이 현재 대한민국 시간이 아니신 분들은 아래 링크를 통해 설정하고 오시는 걸 추천드리겠습니다.)

 

[Ubuntu] - [Ubuntu] Timezone 설정 -> 대한민국 시간 실정

 

[Ubuntu] Timezone 설정 -> 대한민국 시간실정

- 개요 안녕하세요. 이번 시간에는 우분투 환경에서 시간 설정에 대해 알아보겠습니다. 기본적으로 우분투 설치하면 대부분 시스템 시간이 맞지 않습니다. 그렇기 때문에 시간 설정을 해서 문제

any-ting.tistory.com

 

테스트 파일을 생성해 보겠습니다. (참고로 저는 Node.js를 설치하고 진행하고 있습니다.)

 

Node.js 설치하지 않으신 분들은 아래 링크를 통해 설치하셔도 되고 만약 다른 환경이시라면 양해 부탁드리겠습니다.

https://nodejs.org/ko/download/

 

다운로드 | Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

- 테스트 파일 생성

1. 우리는 현재 시간을 콘솔에 출력하는 코드를 활용하겠습니다.

 

index.js 파일을 생성하겠습니다. (명령어 : sudo vi index.js) 

//파일명 : index.js

const date = new Date()

const year = date.getFullYear().toString();

let month = date.getMonth() + 1;
month = month < 10 ? '0' + month.toString() : month.toString();

let day = date.getDate();
day = day < 10 ? '0' + day.toString() : day.toString();

let hour = date.getHours();
hour = hour < 10 ? '0' + hour.toString() : hour.toString();

let minites = date.getMinutes();
minites = minites < 10 ? '0' + minites.toString() : minites.toString();

let seconds = date.getSeconds();
seconds = seconds < 10 ? '0' + seconds.toString() : seconds.toString();

//출력 결과 : 2021-08-11 15:22:03
console.log(year+ "-" + month + "-" + day + " " + hour + ":" + minites + ":" + seconds);

결과가 잘 출력되는지 확인을 위해 콘솔 창에 node index.js 명령어를 실행합니다. 날짜가 잘 나오면 문제가 없습니다.

 

그런 다음 shell script 파일을 하나 생성하겠습니다. 해당 index.js 파일을 실행하기 위해서입니다.

 

start.sh 파일을 생성하겠습니다. (명령어 : sudo vi start.sh)

#파일명 : start.sh

#!/bin/bash

node /home/ubuntu/index.js

index.js 파일을 실행하는 명령어를 설정합니다. (주의 사항... 절대 경로를 설정해야 한다.)

 

우리가 만든 파일이 잘 동작하는지 콘솔 창에 sh start.sh 명령어를 실행합니다. 동일하게 날짜가 잘 나오면 문제가 없습니다.

 

마지막으로 start.sh 파일 권한을 777 모두 허용으로 바꿔줍니다. 그게 싫다면 sudo node /home/ubuntu/index.js 명령어로 수정합니다.

 

- Crontab 설정

 

기본적인 파일 설정을 완료했습니다. 이제 스케줄러를 등록해보겠습니다. 

 

하지만 등록할 때 규칙들이 있습니다. 언제 이 동작할 것인지에 대한 부분입니다.

 

- Crontab 규칙

* * * * *  유저 이름 명령어
┬ ┬ ┬ ┬ ┬
│ │ │ │ └─ 요일 (0 - 6) (0:일요일, 1:월요일, 2:화요일, …, 6:토요일)
│ │ │ └─ 월 (1 - 12)
│ │ └─일 (1 - 31)
│ └─ 시 (0 - 23)
└─ 분 (0 - 59)


- 예시 
   1. 매분, 매시간, 매일, 매월, 즉 1분만다 /home/ubuntu/start.sh 파일을 실행
       * * * * * root /home/ubuntu/start.sh

   2. 0분, 4시, 매일, 매월, 매일, 즉 매일 4시에 /home/ubuntu/start.sh 파일을 실행
       0 4 * * * root /home/ubuntu/start.sh

   3. 10분 간격, 4시, 매일, 매월, 매일, 즉 매일 4시, 4시 10분, 4시 20분, 4시 30분 /home/ubuntu/start.sh파일을 실행
       */10 4 * * * root /home/ubuntu/start.sh

  4. 6시간마다 /home/ubuntu/start.sh 파일을 실행
      0 */6 * * * root  /home/ubuntu/start.sh

   5. 평일(월요일~금요일) 08:00에 /home/ubuntu/start.sh 파일을 실행
       0 8 * * 1-5 root /home/ubuntu/start.sh
 
   6. 주말(일요일, 토요일) 08:00 에 /home/ubuntu/start.sh 파일을 실행
      0 8 * * 0,6 root /home/ubuntu/start.sh
   
   7. 매일 새벽 5시에 재부팅하기
      0 5 * * * root /sbin/shutdown -r now

 

이제 그럼 crontab 파일을 열러 스케줄러를 등록하겠습니다.

(해당 파일을 수정하면 수정된 내용은 자동으로 반영됩니다. 시스템을 재시작하지 않아도 됩니다. :>) 

 

sudo vi /etc/crontab 파일을 안에 내용을 수정하겠습니다.

 

마지막 줄에 저는 스케줄러를 등록했습니다.

 

* * * * * root /home/ubuntu/start.sh >> /var/log/cron.log (매분, 매시간, 매일, 매월, 즉 1분만다 /home/ubuntu/start.sh 파일을 실행)

그러면서 해당 로그를 cron.log 파일에 작성한다. ( >> || > 두 옵션이 있는데 로그 파일에 정보를 누적으로 쌓을 것인지에 대한 옵션이다.)

 

>> 누적으로 로그를 작성

> 누적으로 로그를 작성하지 않음

 

위와 같이 잘 입력 했다면 sudo tail -f /var/log/cron.log 명령어를 통해 1분마다 로그가 쌓이는 걸 확인할 수 있습니다.

 

- 주의사항!!

만약 로그가 쌓이지 않는다면 tail -f /var/log/syslog 파일을 확인합니다.

 

만약 위와 같은 정보를 확인 했다면, postfix를 설치하면 해결됩니다. (메일 설정 관련 내용입니다. 설치하지 않겠다고 선택하고 설치하면 됩니다.)

 

설치 명령어 : sudo apt-get install postfix 

 

그 후 다시 cron.log 파일을 확인하면 아래와 같이 정상적으로 로그를 확인할 수 있습니다.

 

이번 시간에는 crontab을 활용한 스케줄러를 등록했습니다. 꼭 실습을 해보시는 걸 추천드리겠습니다. :)

'백앤드(Back-End) > Ubuntu' 카테고리의 다른 글

[Ubuntu] Timezone 설정 -> 대한민국 시간 설정  (0) 2021.07.26