✅ 리눅스 작업 스케줄링 명령어
단일성 예약 | 반복적 예약 |
특정 시기에 한번 작업을 수행 at, atd 서비스를 이용한다. |
반복적인 작업을 수행 cron, crontab 서비스를 이용한다. |
at 서비스와 cron 서비스는 제어할 수 있는 터미널을 지정받지 못한다. 결과를 메일로 보내오거나 리다이렉션을 이용해 파일로 저장해야 한다. |
✅ at 명령어
- 지정된 명령어를 지정된 시각에 1회 실행하도록 하는 명령어이다.
- 시간이 되면 수행된 후 목록에서 사라진다.
- atd 데몬을 관리하는 명령어이다.
✅ 관련 명령어
- atq : 작업 예약 현황
- atrm [작업 번호] : 작업 예약 삭제
- batch : 시스템에 부하를 주지 않도록 실행
✅ at 옵션
옵션 | 설명 |
-f 파일명 | 스크립트 파일 등을 실행해 줄때 사용한다 |
-m | 작업이 완료될 때 사용자에게 메일을 보낸다 |
-M | 메일 보내기 않기 |
-t [[CC]YY]MMDDhhmm[.ss] | [[CC]YY]MMDDhhmm[.ss]로 시간 지정 |
-l | 예약된 작업 목록을 보여준다. |
-d [작업 번호] | 예약된 작업을 삭제한다.(linux) |
-q | queue 이름을 지정한다. 소문자 알파뱃 1 문자로 순서를 지정한다. -q 옵션으로 예약한 동작을 그룹으로 관리가 가능하다. -q 옵션이 없을 경우 디폴트로 a가 지정된다. |
-V | 버전확인 |
-c [작업 번호] | 예약된 작업 내용 상세보기 |
✅ atd
- 원하는 날짜 또는 시간에 명령들을 한번만 실행해 주는 데몬이다.
- 데몬 : 시스템이 처음 가동될 때 실행되는 백그라운드 프로세스의 일종으로 메모리에 상주하면서 특정 요청이 오면 즉시 대응할 수 있도록 대기 중인 프로세스이다. 윈도우의 서비스(Service)와 유사하다.
데몬 종류
standalone | xinetd |
독자적으로 구동되는 방식 혼자 요청을 받아 처리하며 메모리 상에 항상 구동되고 있다. 응답 속도가 빠르나 메모리에 부하를 줄 수 있다. 요청이 빈번하게 일어나는 프로세스에서 많이 사용된다. |
수퍼 데몬(Super Daemon)이라고도 하며 다른 데몬들의 상위에 존재 요청이 오면 xinetd에 종속되어 있는 하위 데몬(Deamon)을 실행시키는 방식이지만 xinexd 자체는 standalone 방식으로 작동한다. 응답 속도가 비교적 느리나 요청이 들어오지 않을 때는 휴면 상태로 메모리를 사용하지 않아 요청이 빈번하지 않은 서비스에 사용된다. |
✅ timespec 작성 요령
- at 시간 날짜 순으로 기입한다.
at now +2hour (분 - min, 시 - hour)
# 4시
at 16:00
at 04:00 PM
at teatime
at 16:00 2/23/22 (월,일,년)
at 16:00 23-02-23
at 04:00 PM today
at teatime today
새벽 12시 작업
at 00:00
at 12:00 AM
at midnight
내일 정오 작업
at 12:00 PM 2/24/22
at noon tomorrow
✅ cron 명령어
- 특정 시간 또는 특정 시간 마다 특정한 작업을 자동으로 수행하게 해주는 명령어
- 사용자 cron과 시스템 cron 두가지로 나뉘어진다.
- 시스템 cron : 시스템에서 기본적으로 사용하는 cron 설정
- 사용자 cron : root나 일반 사용자가 자신의 cron 설정을 직접해 사용
✅ crontab
- 스케줄 시간을 설정 관리
- 실행할 프로그램을 설정 관리
- cron table을 줄여 crontab이라고 부른다.
✅ cron과 crontab의 차이
cron과 crontab은 담당 역할이 다르다고 볼 수 있다.
crontab은 스케줄 시간과 실행할 파일의 경로를 관리하고 cron은 crontab을 실행한다.
즉, cron → 실행 / crontab → 설정
✅ crontab 관련 파일 경로
cron이 실행할 설정 파일인 crontab이 저장되어 있는 장소는 3곳이 있다.
각각의 유저가 개별적으로 작성할 수 있는 장소와 root 권한이 필요한 장소로 나눠진다.
✅ root 권한이 필요한 경로
/etc/crontab 파일
관리자가 직접 지정한 작업들을 설정하며 임의의 사용자 권한으로 실행할 수 있다.
시스템 관련 작업들을 등록해 사용하는 곳이다.
/etc/cron.d 폴더안
소프트웨어 패키지를 설치할 때 필요한 주기적인 작업을 등록하는 공간으로 사용한다.
임의의 사용자 권한으로 실행할 수 있다.
✅ root 권한 crontab 작성
관리자인 root 권한으로 프로그램을 실행해야 할 경우 /etc/crontab 에 작성해야 한다.
/etc 디렉토리로 이동하면 시간, 분, 일, 월 단위 등 정기적으로 실행할 파일들의 설정을 할 수 있도록 나눠져 있다.
✅ 개인 유저 crontab 경로
/var/spool/cron/crontabs
시스템 개별 사용자를 위한 crontab 파일이며 일반적으로 root 계정용 하나와 계정 사용자당 1개의 파일을 가진다.
파일명은 사용자의 계정명이며 cron은 이 이름을 바탕으로 각 설정 파일에 지정된 작업들을 실행할 때 사용할 UID를 결정한다.
이곳에 있는 설정 파일들은 crontab 명령으로 관리한다.
✅ 개인 유저 crontab 작성
root 권한 없이 실행 가능하거나 접속한 계정으로 crontab을 작성하는 방법
기본적으로 crontab은 /var/spool/cron 에 있다.
✅ cron 동작 방식 및 실행 흐름
cron 파일이 데몬이기 때문에 부팅시에 백그라운드로 실행된다.
cron 동작 방식을 보면 cron 데몬 (crond)가 crontab을 참조하고 있다.
cron 데몬은 어떤 task를 언제 어떻게 수행할 지를 crontab에서 찾아서 실행한다.
cron 데몬은 시스템 스케줄러 정보 뿐만 아니라 각각 사용자가 설정한 작업 예약 정보도 crontab에서 다 확인한다.
✅ cron의 사용자 제어
/etc/cron.deny와 /etc/cron.allow 설정파일에서 사용자에 대한 crontab 제어를 관리할 수 있다.
/etc/cron.allow
이 허용파일이 있는 경우 파일 내 지정된 사용자만 crontab을 등록할 수 있다. 지정되지 않은 사용자들은 crontab 명령을 실행할 수 없다.
/etc/cron.deny
허용파일이 없는 경우에는 이 거부 파일이 사용된다. 파일 내 지정된 사람을 제외한 나머지 사용자에게 crontab 명령 실행 권한이 주어진다.
두 파일 모두 존재하지 않을시
두 파일 모두 존재하지 않는 경우에는 대다수 시스템에서 루트 관리자만이다. 데비안과 우분투 배포판은 이런 경우 모든 사용자에게 실행 권한을 준다.
✅ cron 작업 설정 방법
분 시 일 월 요일 사용자 실행명령
* * * * * [사용자] [수행할 명령어]
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ │
│ │ │ │ └───────── 요일 (0 - 6) (0:일요일, 1:월요일, 2:화요일, …, 6:토요일)
│ │ │ └───────── 월 (1 - 12)
│ │ └───────── 일 (1 - 31)
│ └───────── 시 (0 - 23)
└───────── 분 (0 - 59)
✅ cron, crontab 예제
✅ crontab 기본
crontab 작성
crontab -e
crontab을 작성할 수 있는 파일로 이동되며 crontab 작성 후 저장하면 crontab이 갱신된다.
crontab [특정 파일명] -> 특정 파일안에 있는 cron 예약들을 crontab에 등록하는 방법
crontab 확인
crontab -l
crontab -l -u [사용자명] # 특정 사용자의 crontab만 볼 수 있다.
cat 명령어를 사용한 것과 동일하게 표준 출력으로 crontab 내용이 나온다.
crontab 삭제
crontab -r
crontab 명령 중복 실행 방지
* * * * * /usr/bin/flock -n /tmp/prop.lockfile /home/user/test.sh
- test.sh 가 1분 이상 수행된다면, 중복 실행이 되어 예상치 않은 결과가 나올 수 있다.
- flock -n 을 사용해 shell script가 중복 실행되지 않도록 수행할 수 있다.
✅ crontab 주기별 예제
매분 실행
# 매분 test.sh 실행
* * * * * /home/script/test.sh
특정 시간 실행
# 매주 금요일 오전 5시 45분에 test.sh 를 실행
45 5 * * 5 /home/script/test.sh
# 매시 15, 45분에 test.sh를 수행
15,45 * * * /home/script/test.sh
# 매일 02:00에 수행
0 2 * * * /home/script/test.sh
# 평일(월 ~ 금) 08:00 실행
0 8 * * 1-5 /home/script/test.sh
# 주말(토요일, 일요일) 08:00
0 8 * * 0, 6 /home/script/test.sh
반복 실행
# 매일 매시간 0분, 20분, 40분에 test.sh 를 실행
0,20,40 * * * * /home/script/test.sh
# 매일 6시간 마다 수행 (00:30, 06:30, 12:30, 18:30)
30 */6 * * * /home/script/test.sh
# 1시부터 매 6시간마다 수행 (01:30, 07:30, 13:30, 19:30)
30 1-23/6 * * * /home/script/test.sh
범위 실행
# 매일 1시 0분부터 30분까지 매분 tesh.sh 를 실행
0-30 1 * * * /home/script/test.sh
간격 실행
# 매 10분마다 test.sh 를 실행
*/10 * * * * /home/script/test.sh
조금 복잡하게 실행
# 5일에서 6일까지 2시,3시,4시에 매 10분마다 test.sh 를 실행
*/10 2,3,4 5-6 * * /home/script/test.sh
✅ crontab 실제 예제
1분마다 "Hello World"를 hello.txt 파일에 기록하기
root@ip-172-31-29-48:~/script# vi greet.sh
root@ip-172-31-29-48:~/script# crontab -e
crontab: installing new crontab
root@ip-172-31-29-48:~/script# crontab -l
* * * * * sh /root/script/hello.txt
root@ip-172-31-29-48:~/script# cat hello.txt
Hello World !! testing crontab
Hello World !! testing crontab
1분마다 "현재 시각" 을 greet.txt 파일에 기록하기
root@ip-172-31-29-48:~# crontab -e
root@ip-172-31-29-48:~/script# crontab -l
* * * * * date >> /root/script/greet.txt
root@ip-172-31-29-48:~/script# cat greet.txt
root@ip-172-31-29-48:~/script# cat greet.txt
Wed Mar 30 03:11:01 UTC 2022
root@ip-172-31-29-48:~/script# cat greet.txt
Wed Mar 30 03:11:01 UTC 2022
Wed Mar 30 03:12:01 UTC 2022
Wed Mar 30 03:13:01 UTC 2022
✅ cron logging
crontab을 사용해 정기적으로 작업을 처리하고 해당 처리 내역에 대해 로그를 남기고 싶을 때 사용하는 방법
* * * * * /home/script/test.sh > /home/script/test.sh.log 2>&1
매분마다 test.sh.log 파일이 갱신되어 작업 내용이 어떻게 처리되는지 알 수 있다.
만약 2>&1 을 제거하면 Shell 스크립트에서 표준 출력 내용만 나온다.
만약 위의 명령이 너무 자주 실행되고 또한 지속적으로 로깅이 되어야 해서 로그를 계속 남겨둬야 한다면 다음처럼 입력한다.
* * * * * /home/script/test.sh >> /home/script/test.sh.log 2>&1
그러면 로그가 계속 누적이 되는 것을 확인할 수 있는데 로그가 과도하게 쌓이면 linux 퍼포먼스에 영향을 주므로 가끔씩 비워주거나 파일을 새로 만들어주어야 한다.
로그는 필요없는 cron을 위해서는 다음처럼 입력한다.
* * * * * /home/script/test.sh > /dev/null 2>&1
✅ crontab backup
혹시나 crontab -r을 쓰거나 실수로 crontab 디렉토리를 모두 날려서 기존 cron 내역들이 날아갔을 때를 대비해 주기적으로 crontab을 백업하는 방법이 있다. crontab 내용을 txt 파일로 만들어 저장해두면 된다.
crontab -l > /home/bak/crontab_bak.txt
이것도 자동화를 하면
50 23 * * * crontab -l > /home/bak/crontab_bak.txt
매일 오후 11시 50분에 crontab을 백업해두는 크론 명령어이다.
참고
'Linux' 카테고리의 다른 글
[Linux] LVM - Logical Volume Management (0) | 2022.02.25 |
---|---|
[Linux] Swap memory (0) | 2022.02.25 |
[Linux] 리눅스 명령어 - 시스템 디스크 명령어 (0) | 2022.02.24 |
[Linux] 하드링크와 심볼릭링크 (0) | 2022.02.24 |
[Linux] 리눅스 명령어 - awk (0) | 2022.02.22 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!