...
리눅스 프로세스 스케쥴링
리눅스에서는 특정한 시간에 어떤 작업을 수행하기 위해 스케줄링이라는 기능을 사용한다.
스케줄링에는 at 과 cron 두 가지가 있으며 모두 데몬이 실행중이어야 한다.
- at 스케줄링은 주로 프로그램을 특정시간에 한 번만 사용하고 싶을 때 이용한다.
- cron 스케줄링은 프로그램을 특정 날짜나 시간, 요일에 맞춰 주기적으로 사용하고 싶을 때 이용한다.
프로세스 예약 실행 (일회성)
at 명령어
리눅스에서 at 명령어를 사용해서 프로세스 실행을 예약하는 방법이다.
at명령어 프로그램을 사용하면 일회성의 프로세스(명령어) 실행 예약을 매우 간단하게 할 수 있다.
밑에서 배울 cron을 사용해서도 1회만 명령어를 실행하도록 할 수도 있지만, 일회적인 경우 at명령어 사용방법이 훨씬 간단하다.
$ at [옵션] 시간
- 지정한 시간에 원하는 명령을 실행할 수 있음. 간단한 알림 메시지부터 복잡한 스크립트 등
- 예약된 작업은 /var/spool/at 디렉터리에 개별 파일로 저장.
- 실행 결과는 /usr/sbin/sendmail을 통해 메일로 전송
- /etc/at.allow와 /etc/at.deny 환경설정 파일을 통해 at 명령어에 대한 접근제어가 가능.
at 설치
at이 설치되어 있지 않은 경우 따로 명령어를 통해 설치해야 한다.
$ sudo apt-get install at
at 사용법
at 명령어는 시간 정보는 필수로 입력해야 하고, 그외의 정보는 옵션이다.
- at 시간 명령어를 입력하고 실행한다.
- 그러면 at> 표준 입력을 할 수 있는 프롬프트 창이 나온다. 예약시간대에 이행할 명령어를 입력한다
- 입력을 마치면 [Ctrl]+[D]로 종료(EOT, End Of Transmission) 하면 된다.
이렇게 하면 지정한 시간대에 해당 명령어가 실행하게 된다.
> 2월 9일 20시에 who내용을 sort하는 명령어를 실행하라
TIME 시간대는 hh:mm yyyy-mm-dd (시간:분 연도-월-날짜)의 형식이나
now+값 (minutes/hours/days)로 현재 시간 +(분/시간/일) 단위로 설정할 수 있다.
$ at 21:30 2019-12-25 # : 2019년 12월 25일 21시 30분에 명령어 실행
$ at now+5 minutes # : 현재 시간 5분 뒤에 명령어 실행
at 옵션
옵션 | 설명 |
-V | 버전을 보여준다 |
-q (queue) | 실행할 대기 큐를 정할 수 있다. 사용할 수 있는 문자는 a-z, A-Z 까지이며, a가 기본 큐이다. 특별히 b는 batch 명령에서 사용하는 큐이며 그 외에는 높은 글자를 사용할수록값을 높여서 실행하게 된다. atq로 큐를 확인할 수 있다. |
-f (file) | 표준 입력이 아닌, 뒤에 써주는 파일에서 명령어를 읽어 들인다. |
-m | 실행한 결과를 메일로 통보해준다. |
-l | 예약 작업 목록 확인 - atq를 실행하는 alias이다. |
-d | 예약 작업 목록 삭제 - atrm 을 실행하는 alias이다. |
-v | 끝난 작업이지만 아직 큐에서 삭제되지 않은 작업을 적어준다. |
-c | 작업 리스트를 명령행을 포함하여 표준 출력으로 보여준다. |
-V | 버전확인 |
TIME | 실행할 시간을 기록한다. 기본적으로 "hh:mm YYYY-MM-DD"로 적는다. hh:mm은 시간으로 24시간제를 기본으로 한다. |
# -f 옵션 : 파일을 예약 작업으로 등록
# 작업을 하나씩 등록해서 사용하는 것보다 쉘 파일에 정리해서 -f 옵션으로 사용하는 것이 편하다.
$ at 1915 02062020 -f test.sh # 2020년 6월 2일 19시 15분에 test.sh를 실행하도록 등록.
# -m 옵션 : 출력 결과가 없어라도 작업이 완료될 때 사용자에게 메일을 전송
# 기본값은 출력 결과가 없는 경우 메일을 보내지 않는다.
$ at -m 1915 02062020
$ at -m 17:22 < my-jobs.txt # 5:22 PM에 my-jobs.txt의 명령어가 실행되고 출력결과는 모두 메일로 전송
# -t 옵션: 날짜 형식을 다른 서식으로 입력
# 옵션 없는 날짜 형식은 일 월 년 순으로 입력하기 때문에 가독성이 안좋다.
# 옵션을 사용하면 년 월 일 시 분 순으로 입력이 가능하다.
$ at -t 202006021915 # 2020년 06월 02일 19시 15분
# -q 옵션 : 소문자 알파뱃 문자로 순서를 지정한다.
# -q 옵션으로 예약한 동작을 그룹으로 관리가 가능하다.
# -q 옵션이 없을 경우 디폴트로 a 가 지정된다.
$ at -q c 1915 06022020 # 3번째 순서로 지정
# -l 옵션 : 예약한 작업 리스트를 보여준다.
$ at -l
# -d 옵션 : 예약한 작업을 삭제한다.
$ at -d 작업번호
# -b 옵션 : 시스템에 부하를 주지 않도록 실행한다.
$ at -b 1915 02062020
# -v 옵션 : 작업 실행시간 상세히 보기
$ at -v 1915 02062020
# -c 옵션 : 예약된 작업내용 상세보기
$ at -c 작업번호
atq
현재 예약된 작업 목록을 확인하는 명령어. at -l 과 동일
# atq 출력 포맷
<job number> <date> <hour> <queue> <user-name>
대기 큐에서 대기 중인 작업들의 목록을 확인할 수 있다.
슈퍼 유저(root)인 경우에는 모든 유저의 대기 중인 작업이 출력되고, 그 외에는 로그인된 사용자의 작업이 출력된다.
작업을 설정할 때 큐를 설정할 수 있고,
'a-z'의 큐가 존재하며 'a'에 가까울 수록 우선순위가 높다. 큐를 설정하지 않으면 'a'가 기본이다.
atrm
예약된 작업을 삭제. at -d 옵션과 동일
at 사용자 접근제어
at 명령어는 기본적으로 root 사용자만 사용할수 있다.
단, /etc/at.allow와 /etc/at.deny 두 파일을 이용해 일반 사용자의 사용 권한을 지정해 줄 수 있다.
/etc/at.allow
이 허용파일이 있는 경우 파일 내 지정된 사용자만 crontab을 등록할 수 있다.
지정되지 않은 사용자들은 crontab 명령을 실행할 수 없다.
/etc/at.deny
허용파일이 없는 경우에는 이 거부 파일이 사용된다.
파일 내 지정된 사람을 제외한 나머지 사용자에게 crontab 명령 실행 권한이 주어진다.
즉, at.deny 파일에 등록된 사용자는 at를 사용할 수 없게 된다.
<두 파일 모두 존재하지 않을시>
두 파일 모두 없다면 루트 관리자만 사용할 수 있다.
프로세스 예약 실행 (주기성)
크론 (cron)
- 미리 정한 시간에 명령어, 프로그램, 작업 등을 실행할수 있는 서비스.
- at 명령어는 단 1회만 예약시간에 작업 실행.
크론 서비스는 반복적으로 실행할 수 있음. - 크론 데몬 crond와 예약작업 정보가 담겨있는 설정파일로 구성
cron은 일종의 데몬이다.
즉 한 번 실행되면 시스템에 상주하며 필요할 때마다 동작한다.
크론 데몬은 crond라는 이름을 갖는데, 설정 파일 혹은 crontab에 기록된 날짜나 시간이 되면 지정된 작업을 수행한다. 이 작업에는 특정 주기마다 실행될 스크립트를 모은 디렉토리내의 작업들 혹은 개별 명령이 적용될 수 있다.
대부분의 유닉스 배포판에서 crond는 이미 포함되어 있고, 시작 스크립트에도 등록되어 있기 때문에 이미 실행되고 있을 것이다.
- Cron은 정해진 스케줄에 따라 작업을 수행하는 데몬.
- Crontab은 데몬이 바라보는 작업 리스트
즉, cron 작업을 설정하는 파일을 crontab 파일이라고 보면 된다.
cron프로세스는 /etc/crontab 파일에 설정된 것을 읽어서 작업을 수행하게 된다.
시스템 크론 설정 디렉토리
cron 데몬은 같은 작업을 주기적으로 반복 실행되도록 하는 작업 스케줄용 데몬으로,
매분, 매시, 매일, 매주, 매월, 매요일 단위로 cron 데몬에 의해서 작업이 실행될 수 있다.
/etc/ 디렉토리에 일,주,월,요일 단위 형태로 cron 디렉토리가 존재하며, 이들 디렉토리에는 작업 예약 스크립트들이 들어 있다. 매일 이 작업 스크립트들은 cron 데몬에 의해서 자동적으로 실행된다.
이 디렉토리 내에 스크립트 파일을 저장해두면, 디렉토리에 따라서 매 시간, 매일, 매주, 매월 등 미리 정해진 주기마다 해당 스크립트가 실행 되게 된다.
# cron 디렉토리 확인
$ find /etc | grep cron
cron 동작방식 (실행 흐름)
- 부팅을 하면, 부팅 프로그램 init이 백그라운드에 등록되고 crond 데몬이 실행된다.
- /etc/crontab을 읽어들여, 주기마다 실행되는 cron디렉토리를 실행하고, /var/spool/cron을 읽어 사용자 cron을 실행시킨다.
- 만일 서버가 중지되면, anacron을 통해 작업 수행을 유지시킨다
- 수행 이력과 변경된 내용에 대한 로그는 /var/log/cron에 기록된다.
anacron이란?
/usr/sbin/anacron 에 위치하며,
크론과 같이 동작하는 프로그램으로 서버가 일정 시간 중지되었을 때에도 작업이 실행되는 것을 보장하기 위해 사용하는 도구이다.
crontab
crontab은 스케줄 시간과 실행할 파일의 경로를 관리하고, cron은 crontab을 실행한다.
cron을 이용한 스케줄링은 시스템운영에 필요한 작업과, 사용자에게 필요한 작업 두 가지로 나뉜다.
- 시스템 운영에 필요한 작업은 root 권한으로 /etc/crontab에 등록해서 수행할 수 있다.
- 사용자가 필요에 의해 지정하는 작업은 crontab 명령어를 통해 등록할 수 있다.
crontab 파일 경로
cron이 실행할 설정 파일인 crontab이 저장되어 있는 장소는 3곳이 있다.
각각의 유저가 개별적으로 작성할 수 있는 장소와 root 권한이 필요한 장소로 나눠진다.
일반 유저로 crontab을 작성하는 방법과, root 권한으로 crontab을 작성 방법은 다르기 때문에 주의해야 한다.
개인 유저 crontab 경로
/var/spool/cron/crontabs
root 권한이 필요한 경로 (시스템 크론 설정 디렉토리)
/etc/crontab 파일
/etc/cron.d 폴더안
crontab 파일 형식
크론설정파일에 크론작업을 정의 한다.
총 7개의 필드로 구성되어 있다.
분, 시간, 일, 월, 요일, 사용자명, 실행할 명령어 순으로 기재한다.
요일의 경우 일(0,7), 월(1), 화(2), 수(3), 목(4), 금(5), 토(6)
+ 시간 작성 예제
45 22 * * * # 22시45분에 실행
28 03 * * * # 03시28분에 실행
0 17 * * 1 # 매주 월요일 17시00분에 실행
0,10 17 * * 0,2,3 # 매주 일, 화, 수요일 17시00 분과 17시10분에 실행
0-10 17 1 * * # 매달 1일 17시00분부터17시10분까지 1분 단위로 실행
0 0 1,15 * 1 # 매달 1일과 15일 그리고 월요일 24시00분에 실행
42 4 1 * * # 매달 1일 4시42분에 실행
0 21 * * 1-6 # 월요일 부터토요일까지 21시00분에 실행
0,10,20,30,40,50 * * * * # 10분 간격으로 실행
*/10 * * * * # 10분 간격으로 실행
* 1 * * * # 1시00분 부터 1시59분 까지 1분 간격으로 실행
0 */1 * * * # 매시간 0분에 실행(1시간 간격으로 실행)
0 * * * * # 매시간 0분에 실행(1시간 간격으로 실행)
5 2-5 * * * # 2시 5분, 3시 5분, 4시 5분, 5시 5분에 실행
2 8-20/3 * * * # 8시 2분, 11시 2분, 14시 2분, 17시 2분, 20시 2분에 실행
30 5 1,15 * * # 매달 1일과 15일 5시30분에 실행
# 월-토요일마다 오전 1시 정각에 /usr/bin/dcs.sh를 실행
0 1 * * 1-6 ihd /usr/bin/dcs.sh
# 매년 1월부터 10월까지 두 달 주기로 1일날 오전 7시 정각에 /bin/vipcheck.sh 실행
0 7 1 1-10/2 * /bin/vipcheck.sh
참고로 각 필드는 위 표에 명기된 설정 값 기호 '*', '-', ',', '/' 를 사용할 수 있다.
- '*' : 각 필드 자리에 *기호가 오면 해당 필드의 모든 값을 의미.
- 예를 들어 두 번째 필드에 *가 오면 매시, 3번째 필드는 매일, 4번째 필드의 *는 매월..
- '-' : 그 사이의 모든 값.
- 세 번째 필드에 '1-5'면 1일,2일,3일,..,5일
- ',' : 지정한 모든 값을 의미 (불규칙적인 값 지정시 주로 사용)
- 2 번째 필드에서 "1,3,4"는 1시 3시 4시를 의미.
- '/' : '/'는 연결된 설정 값 범위에서 특정 주기로 나눌 때 사용.
- 2 8-20/3 * * * 8-20사이 범위값을 3으로 나누어 분리해 실행 -> 8시 2분, 11시 2분, 14시 2분, 17시 2분, 20시 2분에 실행
root 권한 있는 경우 : /etc/crontab 편집
root 권한이 있는 경우 /etc/crontab 파일을 편집한다.
또는 /etc/cron.d 안에 crontab 파일에 설정을 해도 자동으로 실행된다.
# 시간 단위, 분 단위, 일 단위, 월 단위 등 정기적으로 실행할 파일들의 설정을 할 수 있도록 나눠져 있다.
/etc/crontab
/etc/cron.d
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.hourly/
/etc/cron.monthly/
우분투의 crontab 파일은 아래처럼 생겼다.
SHELL은 cron을 실행할 쉘을 적어 주는 부분이고,
PATH는 cron을 실행할 때의 $PATH다
root 권한 없는 경우 : $ crontab -e
root 권한이 없는 경우에는 crontab -e를 실행해서 편집한다.
crontab 명령어를 사용하여 작성하는 cron은 개별사용자용 크론이다. /var/spool/cron 아래에 있다.
시스템 운영에 필요한 작업은 root 권한으로 /etc/crontab에 등록해서 주기적으로 수행할 수 있고
사용자는 crontab이라는 명령을 수행해서 등록할 수 있다.
$ crontab [옵션] # 사용자가 주기적인 작업을 등록하기 위해 사용하는 명령어
옵션 | 내용 |
-e | crontab 파일 편집. |
-l | crontab 파일 내용 표시. |
-r | crontab 파일 삭제 특정 명령만 지우는 게 아니라 등록된 crontab 자체가 지워져 모두 날아갈 수 있으니 주의해야 한다. |
-u 유저명 | 지정한 유저가 등록한 crontab 리스트 표시. |
$ ps -ef | grep crond
# crond가 실행되고 있는지 확인
$ crontab -e
# 개별사용자의 cron 편집
$ crontab -l
# 등록되어 있는 crontab 목록이 출력
$ crontab -r
# 예약된 작업이 모두 삭제
$ crontab -u 사용자명 -e
# root의 일반 사용자 cron 설정 방법
$ crontab -u zero -e
# zero 사용자의 crontab 내용을 작성하거나 수정한다
$ crontab -u 사용자명 -l
# root의 일반 사용자 cron 설정 확인 방법
$ crontab -u 사용자명 -r
# root의 일반 사용자 cron 설정 삭제 방법
crontab root권한 실행 vs 개인 사용자 실행 차이점
root 권한 crontab 실행)
/usr/local/bin/script.sh를 매분 실행하게 한다고 가정하자. /etc/crontab에 적는다면 아래처럼 적는다.
* * * * * username /usr/local/bin/script.sh
그리고 저장하면 시스템이 알아서 주기적으로 실행해준다.
개인 사용자 crontab 실행)
crontab -e로 적는다면 아래처럼 적는다.
* * * * * /usr/local/bin/script.sh
그리고 저장하면 시스템이 알아서 주지적으로 실행해준다.
root권한 crontab 파일과 개인사용자 crontab 파일의 문법 차이는, 사용자를 명시했는지만 차이가 있다.
crontab -e의 실행 사용자는 작성자 자신이 된다.
crontab 재시작
crontab 설정 변경 후 항상 cron 서비스를 재시작해야 한다.
아래 명령어중 하나를 실행하면된다. cron restart 가 안되는면 crond restart 를 사용하면 된다.
$ service cron status # 동작 여부 확인
$ service cron start # 가동
$ service cron restart # 재가동
crontab 접근제어
위에서 설명한 at 명령어의 접근 제어와 동일하다고 보면 된다.
기본적으로 root 사용자만 사용하고, /etc/cron.allow 나 /etc/cron.deny 파일에 사용자 추가하여 접근제어 가능하다.
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.