연관 글: hello-i-t.tistory.com/40
<주기적인 작업 예약을 위한 시스템 crontab 설정>
1. 작업 스케줄링(예약)의 종류
(1) 일회성 작업
(2) 주기적 작업
작업의 종류에 따라 스케줄링 방식이 달라진다. 한 번만 실행되면 되는 작업은 'at' 명령어를 사용하고, 주기적으로 반복되어야 하는 작업은 'crontab' 명령어를 사용한다.
일회성 작업 예약은 atd 데몬(daemon)에 의해 처리되고, 한 번 실행하고나면 작업이 삭제된다. 주기적 작업 예약은 crond 데몬에 의해 처리되고, 작업을 삭제하기 전까지 유지된다.
* 데몬(daemon)
데몬(daemon = background process; 백그라운드 프로세스)은 백그라운드에서 실행되는 리눅스, 유닉스 프로그램이다. 거의 모둔 데몬의 이름은 'd'로 끝난다. 리눅스에서는 종종 부팅시 데몬이 시작된다. /etc/init.d 디렉토리에 저장된 쉘 스크립트는 데몬을 시작하고 중지하는 용도로 사용된다.
# 데몬 시작/중지/재시작하는 방법
service <daemon-name> start
service <daemon-name> stop
service <daemon-name> restart
# 실행 중인 데몬 리스트 확인하기
service --status-all
데몬에 대해 자세히 설명한 이유는 at, contab으로 등록한 작업 예약은 지정된 시점에 실행되지만, 실행 결과를 터미널에서 확인할 수 없기 때문이다.
스택오버플로우의 이 글(stackoverflow.com/questions/14524966/how-to-see-the-daemon-processs-output-in-linux)에 나와있듯이, 데몬의 실행 결과는 터미널 화면으로 확인 할 수 없다.
이는 위의 이미지에 있는 탭 이름에 나와있는 tty 때문에 생긴 문제이다. 데몬은 제어터미널인 tty가 지정되지 않았으니 표준 출력인 터미널 화면에도 출력되지 않는다.
* tty
Teleprinter or teletypewriter (TTY), an electromechanical typewriter paired with a communication channel.
Sometimes used more generally for any type of computer terminal.
<위키피디아 TTY: https://en.wikipedia.org/wiki/TTY>
실행 결과를 터미널로 확인하고 싶으면, 실행 결과를 특정 터미널로 출력하도록 리다이렉션을 하면 된다. wall 명령어를 사용해 시스템과 연결된 모든 터미널에서 확인할 수도 있고, 로그 파일로 출력 결과를 저장하는 등 방법은 다양하다.
2. 일회성 작업 예약(at)
at이 설치되어 있지 않은 경우 'sudo apt-get install at' 명령어를 통해 설치해야 한다.
# at 사용법
at [option] <time-spec>
시간 정보는 필수로 입력해야 하고, 그외의 정보는 옵션이다.
'at <time-spec>'을 입력하면 프롬프트가 전환되어 예약할 작업(명령어, 스크립트 파일 등)을 입력할 수 있게 된다. 'Ctrl+D'를 입력하면 프롬프트를 빠져나올 수 있다.
'atq'를 입력하면 예약한 작업을 확인할 수 있고 출력 포맷은 아래와 같다.
# atq 출력 포맷
<job number> <date> <hour> <queue> <user-name>
대기 큐에서 대기 중인 작업들의 목록을 확인할 수 있다. 슈퍼 유저(root)인 경우에는 모든 유저의 대기 중인 작업이 출력되고, 그 외에는 로그인된 사용자의 작업이 출력된다.
작업을 설정할 때 큐를 설정할 수 있고, 'a-z'의 큐가 존재하며 'a'에 가까울 수록 우선순위가 높다. 큐를 설정하지 않으면 'a'가 기본이다.
작업의 목록은 '/var/spool/cron/atjobs'에 저장되고, 작업이 실행되고 나면 사라진다.
cat 명령어를 사용하면 예약된 작업이 어떤 명령을 수행할지도 알 수 있다.
3. 주기적 작업 예약(cron, anacron)
at 과 crontab 의 대표적인 차이는 작업을 생성했을 때 생기는 파일의 개수인 것 같다. at 명령어를 사용하면 예약한 작업의 개수만큼 파일이 생기지만, crontab 명령어를 사용했을 때는 각 사용자의 이름 당 하나씩 파일이 생긴다(a라는 유저가 작업을 10개를 예약해도, 100개를 예약해도 파일은 하나).
연관 글에서도 언급했지만, cron으로 셸 스크립트 실행을 예약했을 때는 특히 권한에 주의해야 한다. cron이 셸 스크립트를 실행할 권한을 줘야 하고, cron으로 실행되는 프로그램은 제어터미널이 지정되지 않아서 문제가 발생해도 확인하기 힘드므로 아래와 같은 명령어를 사용해서 표준 출력과 표준 오류 출력을 로그로 저장하는 것이 좋다.
* * * * * user-name command > /log/crawler.log 2>&1
crontab은 주기적인 실행해야 하는 예약된 작업의 테이블이다. crontab을 설정하는 방법에는 두가지가 있다.
# 전역(시스템)
crontab -e
# 사용자
vi /etc/crontab
(1) 시스템 작업 예약(root 권한)
- cron.d/
시스템 cron 파일이 담긴 폴더다. 관리자가 직접 등록한 파일도 있고, 특정 패키지를 설치할 때 함께 설치되는 시스템 cron 파일은 이 디렉토리에 저장되어 자동으로 예약 작업이 실행된다.
- cron.daily/
매일 실행되어야 하는 작업이 담긴 폴더
- cron.hourly/
매시간 실행되어야 하는 작업이 담긴 폴더
- cron.monthly/
매월 실행되어야 하는 작업이 담긴 폴더
- cron.weekly/
매주 실행되어야 하는 작업 이 담긴 폴더
- crontab
시스템 cron 파일로, 'vi /etc/crontab'을 입력하면 직접 예약할 작업을 등록할 수 있다.
이 파일은 예약할 작업을 등록하는 것보단 템플릿으로 사용하는 것이 더 권장된다.
(cron 파일을 작성하는 방법은 연관글에서 언급했으니 넘어간다. )
(2) 사용자 작업 예약
'crontab -e'를 입력하면 /tmp 에 crontab.<?> 이라는 파일이 생성되고, 이를 편집할 수 있게 vi 편집기가 실행된다. 해당 사용자가 등록한 예약 작업이 없을 경우 파일은 비어있다.
(3) anacron
anacron은 시스템에 예상치못한 오류 또는 기타 이유로 셧다운이 되어 예약 작업을 수행하지 못했을 경우, 시스템이 다시 부팅되었을 때 실행되지 못한 예약 작업을 확인해서 작업을 수행한다. 즉, 작업을 놓쳤을 경우 일반 cron은 설정된 실행 주기를 기다리지만, anacron은 설정된 시간이 아니라도 실행한다.
'DevOps > Linux' 카테고리의 다른 글
[Linux]디스크 관리 下 스왑 메모리 (1) | 2021.05.23 |
---|---|
[Linux]디스크 관리 中 파일시스템 (0) | 2021.05.23 |
[Linux]디스크 관리 上 디스크 인식, 파티셔닝 (0) | 2021.05.13 |
[Linux]우분투에 파이참 설치하고 바로가기 만들기 (0) | 2021.05.10 |
[Linux]Hard link, Symbolic link (0) | 2021.05.07 |