- 리눅스 프로세스 스케쥴링

  • 리눅스에서는 특정한 시간에 어떤 작업을 수행하기 위해 스케줄링이라는 기능을 사용한다.
  • 스케줄링에는 at 과 cron 두 가지가 있으며 모두 데몬이 실행중이어야 한다.
  • at 스케줄링은 주로 프로그램을 특정시간에 한 번만 사용하고 싶을 때 이용한다.
  • cron 스케줄링은 프로그램을 특정 날짜나 시간, 요일에 맞춰 주기적으로 사용하고 싶을 때 이용한다.

([Linux] at이란? https://dev-record-levelup.tistory.com/2)

 

- Cron이란?

  • 특정한 시간에 또는 특정 시간 마다 어떤 작업을 자동으로 수행하게 해주고 싶을 때 사용하는 명령어.
  • cron은 특정한 시간에 특정한 작업을 수행하게 해주는 스케줄링 역할을 한다.
  • cron이 언제 무엇을 하는지 특정 파일에 저장하는 것을 크론탭(Crontab)이라고 한다.

예를 들어, 새벽 4시에 데이타베이스 백업 받아 줘라든지, 아침 7시에 서버의 사용량을 리포트하도록 한다든지 등등 적절하게 사용하면 아주 편리하게 성과를 낼 수 있는 방법이다.

 

- Crontab은 언제 사용하는지?

  1. 특정 시간에 특정 작업을 해야 할 때
  2. 반복된 시간에 반복된 작업을 해야 할 때
  3. 예약 작업을 사용해야 할 때

 

- Crontab 설정

  • etc 하위에 위치한 crontab파일을 열어 crontab 설정 방법을 확인한다.

필드  설명 입력 가능 예시
m minute, 분 정보를 입력한다. 0~59 사이의 숫자
h hour, 몇시에 수행될지를 정하는 시 정보 0~23 사이의 숫자
dom day of month (= day), 일자 정보 1~31 (1~해당 월의 최대일자까지)
mom month, 월 정보 1~12
dow day of week, 요일정보 0~7 (0 일요일, 1 월요일, 2 화요일
순으로 증가. 7은 다시 일요일)
user user, 사용자 정보  
command command, 수행되어야 할 명령어  

 

- Crontab 명령어

일부러 잘못된 옵션을 주고 명렁어를 수행하면 아래와 같이 도움말을 볼 수 있다.

# 현재 크론탭에 설정되어 있는 내용 확인
crontab -l
# 크론탭 내용 입력/수정 (vi 에디터 활용, 설정 입력 후 :wq 로 저장)
crontab -e
# 현재 크론탭에 설정되어 있는 내용 삭제
crontab -r
# 특정 user의 crontab을 설정할 때 
# 다른 명령어를 쓸 때 같이 쓰면 특정 사용자의 crontab 조회 및 수정 가능
crontab -u
# crontab 내용 삭제 전 확인 문구 띄우기
# confirm창 같은 느낌으로, 삭제여부 재확인
crontab -i

  • 삭제 전 확인 문구 띄우기, crontab -i -r 또는 crontab -ir 모두 동일하게 동작함.

 

  • 아래 명령어를 통해 실행 중인 cron 프로세서를 확인할 수 있다.
ps -ef|grep crond

 

- 예제

  • crontab -e 명령어를 사용하면 vi 모드로 전환이 되면서 crontab을 등록할 수 있다.

 

매분 실행

# 매분 test.sh 실행
* * * * * /home/script/test.sh

* (asterisk) : 해당 기호가 입력되면 해당 필드의 모든 값에서 cron이 수행된다.

 

특정 시간 실행

# 매주 금요일 오전 5시 45분에 test.sh 를 실행
45 5 * * 5 /home/script/test.sh

 

반복 실행

# 매일 매시간 0분, 20분, 40분에 test.sh 를 실행
0,20,40 * * * * /home/script/test.sh

, (comma)  : 특정 값을 여러 개 지정할 수 있다. 구간이나 주기로 지정이 안되는 불특정한 값일 때 사용

 

범위 실행

# 매일 1시 0분부터 30분까지 매분 tesh.sh 를 실행
0-30 1 * * * /home/script/test.sh

- (dash)  : 숫자 구간을 지정할 수 있다.

 

간격 실행

# 매 10분마다 test.sh 를 실행
*/10 * * * * /home/script/test.sh

/ (slash)  : 값을 특정 주기로 나눌 때 사용

 

조금 복잡하게 실행

# 5일에서 6일까지 2시,3시,4시에 매 10분마다 test.sh 를 실행
*/10 2,3,4 5-6 * * /home/script/test.sh

→ crontab을 설정하고 wq로 저장한다.

 

- Crontab 설정 변경내용 적용

  • crontab -e로 새롭게 저장한 뒤에는 crontab 변경 내용에 대해서 명령어로 재시작 또는 시작해줘야 한다.
  • 시작, 재시작, 중단 명령어는 ubuntu와 linux가 다르다.
OS ubuntu linux
시작 service cron start service crond start
재시작 service cron restart service crond restart
중단 service cron stop service crond stop
상태 확인 service cron status service crond status

 

- Crontab 권한

- Crontab 권한 부여

cron.allow

  • cron 허용 계정목록
  • (기본값) 파일 없음 → 모두 허용
[root@zetawiki ~]# ll /etc/cron.allow
ls: cannot access /etc/cron.allow: No such file or directory

cron.deny

  • cron 금지 계정목록
  • (기본값) 내용 비어 있음 → 모두 허용
[root@zetawiki ~]# ll /etc/cron.deny
-rw-r--r--. 1 root root 0 Jul 19  2011 /etc/cron.deny
[root@zetawiki ~]# cat /etc/cron.deny
[root@zetawiki ~]#

 

  • cron.allow와 cron.deny 파일이 둘 다 존재하지 않는 경우, 루트 사용자 권한이 있는 사람만 crontab명령으로 작업할 수 있다.
  • cron.allow 및 cron.deny 파일을 편집하거나 만들려면 수퍼유저(root) 권한이 필요하다.
  crontab 생성, 편집, 표시, 제거 가능 crontab 생성, 편집, 표시, 제거 불가능
cron.allow (O) cron.allow에 나열된 사용자만 나머지
cron.allw (X)                         
cron.deny (O)
cron.deny에 나열된 사용자를 제외한 모든 사용자 cron.deny에 나열된 사용자
cron.allow (X)                 
cron.deny (X)
슈퍼유저 권한 필요(ex. root) 슈퍼유저 제외 나머지 모두
  • root계정으로 cron.allow 수정하여 해당 계정 추가(한 라인에 사용자 이름 하나씩)

 

- crontab 파일 권한 여부 확인 방법

#해당 사용자계정으로 로그인

crontab -l
crontab: can't open your crontab file
-> 1) crontab 파일 존재하는지 확인 필요 2) crontab 파일 권한 확인 필요

crontab: you are not authorized to use cron. Sorry.
-> 1) cron.allow 파일에 사용자 이름 등록 필요

 

- Crontab 사용 팁

1. 한 줄에 하나의 명령만 쓰자

# 잘못된 예
* * * 5 5
/home/script/test.sh
# 잘된 예
* * * 5 5 /home/script/test.sh

 

2. 필요할 때 주석을 달자

# 주석 #
#--------------------#
# 이것은 주석입니다. #
#--------------------#

3. 로그(log) 남겨두자

# 덮어쓰기
* * * * * /home/script/test.sh > /home/script/test.sh.log 2>&1

# 기존의 test.sh.log에 이어서 쓰기
* * * * * /home/script/test.sh >> /home/script/test.sh.log 2>&1
# 로그 확인
vi /home/script/test.sh.log

 

4. 주기적으로 백업하자

  • 혹시라도 crontab -r 를 쓰거나 실수로 crontab 디렉토리를 날려버려서 기존 크론 내역들이 날아갔을 때를 방지하여 주기적으로 크론탭을 백업하자.
# 크론탭 내용을 txt 파일로 만들어 저장
crontab -l > /home/bak/crontab_bak.txt
# 크론탭 내용을 txt 파일로 만들어 저장 (자동화)
50 23 * * * crontab -l > /home/bak/crontab_bak.txt

 

 

- Crontab 사용 시 주의할 점

crontab의 규칙에 맞게 설정을 했음에도 불구하고 동작하는 않은 경우가 발생한다. 보통 아래의 이유 때문이다.

 

1. 환경변수

  • SHELL

등록된 작업을 실행시킨 쉘을 지정한다**(크론탭은 실행시에 별도로 쉘을 띄운다)**. 지정하지 않을시 기본값으로 /bin/sh로 지정된다.

  • PATH

쉘을 별도로 띄워서 실행하는 특성때문에, 쉘에서 프로그램을 찾기위한 PATH도 별도로 지정해줄 필요가 있다.

# 매분마다 sample.sh을 실행하며 프로그램이 작동할 쉘과 경로를 지정해준다.
crontab -e

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

* * * * * sample.sh

 

2. 권한문제

  • vi /etc/crontab을 통해 크론탭을 직접 수정을 했을 경우 root 권한 명령을 실행하려면 root권한을 명시해 주어야 한다.
crontab -e
* * * * * example.sh

# 두 번째 처럼 root 권한을 명시해야 한다.
vi /etc/crontab
* * * * * root example.sh

 

3. 절대경로 / 상대경로

  • 절대경로로 작성하여 나중에 생길 오류를 방지하자.

즉,  /usr/local/bin/php74를 실행 시에는 php74 보다는 /usr/local/bin/php74로 절대 경로로 명시

 

4. 최소 반복 시간

  • 크론탭의 최소 반복시간은 1분이므로 그보다 작은 시간으로 하면 안된다.

 

 

 

 

 

 

 

 

 


Reference

http://jdm.kr/blog/2#특정_시간_실행https://jhnyang.tistory.com/m/68https://jdm.kr/blog/2https://ojava.tistory.com/154

https://finance-it.tistory.com/106

https://zetawiki.com/wiki//etc/cron.allow,_cron.deny

https://jinmay.github.io/2018/01/07/linux/basic-of-crontab/

https://tipland.tistory.com/80

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

[Linux] rsync란?  (0) 2023.04.28
[Linux] /tmp와 /var/tmp의 차이  (2) 2023.03.11
[Linux] Nohup이란?  (0) 2023.03.10
[Linux] at이란?  (0) 2022.06.30

+ Recent posts