본문 바로가기

OS/Linux

[Linux] 배치 작업과 크론탭 사용하기


이번에는 리눅스 서버에서 
배치 프로그램을 작성하고 스케쥴러를 통해 자동으로 실행되는 작업을 해보려 합니다.

혹시 글을 보면서 테스트 해볼만한 리눅스 서버 환경이 없다.

개인 PC로 리눅스 환경 셋팅 클릭!


참고하셔서 PC로 리눅스 환경을 구축해보시는 것도 좋은 방법일 것이라 생각합니다.

배치 프로그램이란?

사실 저는 프로젝트 나가서 '배치' 라는 것을 처음 들어보았습니다. 

처음 배치란 것을 들었을 때는 그 의미도 이해하기가 상당히 어려웠는데요.
 


네이버에 검색해보면 조금 이해가 가실지 모르겠지만,

배치(batch)라는 것은 "일괄적으로 뭔가 처리되는"

이 정도로 해석하시면 될 거 같습니다.

즉, 여러 가지 일들을 한꺼번에 처리하기 위해 만든 프로그램을 배치 프로그램이라고 보시면 될 것 같습니다.

리눅스에서는 윈도우에서와 다르게 마우스를 사용하지 않고
(별도의 GUI 구성을 하지 않는한) 

주로 명령어를 통해서 파일을 실행시키거나, 삭제, 수정 등의 작업을 하게 됩니다.

때문에 간단한 작업이라면 몰라도, 한꺼번에 여러 작업을 처리하려면 

그 만큼 명령어를 일일이 타이핑 해줘야 하는 번거로움이 있죠.

그래도 난 프로그래머니깐 영화에 나오는 전형적인 프로그래머나 해커 역할의 배우들이 하는 것처럼

좀 폼나게 리눅스 명령어 타다다다다닥 소리나게 치면서 일할거야!

하시는 분들은  일일이 타이핑 하시고 야근하시길 


응원합니다~ ^^*

만일 그런 생각을 가지신 분들이라도 매일 정해진 시간에 혹은 주기적으로 

수많은 양의 작업을 매번 타이핑으로 해결하실 수는 없으실 거라고 봅니다.

이럴때 필요한게...? 바로 이 배치 프로그램입니다.

배치 프로그램은 보통 수 많은 명령어
(간단할 수도 있긴 합니다만.) 로 이루어져 있습니다.

또한, 이 배치 프로그램을 실행하는 것은 개발자가 아닌 스케쥴러가 실행하게 됩니다.

스케쥴러란?

일정 주기 혹은 특정 시간에 배치 프로그램을 실행시켜 주는 프로그램 입니다.

리눅스에는 대표적인 스케쥴러로 크론탭(crontab) 이 있습니다.

리눅스에 접속해서 진행 해 보겠습니다.

crontab -l   (알파벳 '엘'입니다)

크론탭에 등록된 예약리스트를 볼 수가 있습니다.

crontab -l  이 명령어를 작성하시고 엔터를 치시면
크론탭 스케쥴러에서 돌아가는 배치 프로그램들을 보실수가

없네요??

no crontab for root
크론탭이 깔려있지 않은건가...?

하고 명령어를 이렇게 쳐봅니다.

  • ps -ef | grep crond

프로세스에서 실행중인지 알아보는 명령어 입니다 

->  '|' 이건 엔터 위의 \ 키를 shift 누르면 나오는 수직선입니다

※ 명령어는 너무 다양하고 상황에 따라 다르기 때문에 여기서는 그냥 넘어가도록 하겠습니다. 

리눅스 혹은 유닉스 명령어는 개별적으로 검색해 보시면 될 거 같습니다.


크론탭(프로그램)이 실행중인 것이 확인이 됩니다.

그렇다면 위에서 안나온 이유는...?

크론탭은 계정별로 다른 스케쥴링을 등록할 수 있는데,
지금 제가 root 계정으로 접속하였기에

no crontab for root  
'root 계정에는 등록된 스케쥴이 없다.' 라는 내용은 출력한 것입니다.
그럼 간단한 파일을 만들고 스케쥴에 등록해서

실행이 되는 작업을 해봄으로써 배치 프로그램에 대해 이해해보고자 합니다.

배치 프로그램 만들기

cd(디렉터리 이동) 명령어를 사용하여 적당한 디렉토리 위치에서

1) vi test1.sh 명령어를 입력 

전 /usr 경로에서 진행하였습니다.


본격적으로 배치 파일을 만들어 보겠습니다.


2) sh (쉘) 확장자의 파일 


vi 명령어는 해당 파일명의 파일이 존재하면 수정을 하고 없으면 새로 만들어 주는 역할을 합니다.


※ 쉘 파일은 설명하자면 조금 길 수도 있는데, 간단하게 설명드리면 명령어 처리기 라고 보시면 됩니다. 



처음 만든 파일이라 New File 이라고 뜰 것 입니다.


i (insert) 를 누르면 입력할 수 있습니다.


3) 해당 명령어 작성


#!/bin/bash

A="hello_world"

echo $A



입력이 끝나면 Esc 누르고 :wq 를 입력해주면 파일이 저장됩니다.


명령어들을 살펴보면,


#!/bin/bash   (bash 라는 명령어 처리기를 사용하겠다는 의미)

A="hello_world" (A라는 문자열 변수를 선언)

echo $A          (A를 파라미터로 받아 출력)


여기까지 잘 진행하셔서 저장하셨다면


4) ls 명령어를 입력하면


현재 경로에 test1.sh라고 쉘 파일이 성공적으로 생성된 것을

확인할 수 있습니다.



그럼 우리가 제대로 만들고 실행까지 되는지 해볼까요??


5) ./test1.sh 



Permission denied 권한이 없다고 나옵니다.


쉘 파일을 직접 만들어도 바로 권한을 받지는 못하나 봅니다..


구글링으로 권한 획득법을 찾아보았습니다.



6) chmod 777 test1.sh


777권한은 모든 사용자에게 읽기,쓰기,실행을 하게 해준다고 합니다.


test1.sh 파일이 하얀색에서 초록색으로 변했습니다.


다시 실행해봅시다.



쉘 파일에서 출력하게 만들어준 "hello_world"라는 문자열이 출력되었습니다.


어떻게 보면 가장 간단한 배치 프로그램이 완성되었다고 볼 수 있습니다.


이걸 이제 스케쥴러에 등록하여,내가 원하는 시간에 작동하도록 해보겠습니다.


7) crontab -e



크론탭을 수정(등록)할 수 있습니다.



위의 그림과 같이 입력해줍니다.


# 은 주석을 의미하므로 원하는 대로 작성합니다.


'크론탭 실행리스트' 라고 작성했습니다.


=========================================

 맨 앞의 *은 *분을 의미함 (분을 의미:0~59) 

 그 뒤의 *은 *시를 의미함 (시를 의미:0~23)

 그 뒤의 * 은 매일을 의미함 (일을 의미:1~31)

 그 뒤의 * 은 매월을 의미함 (월을 의미:1~12)

 그 뒤의 * 은 매주를 의미함(요일을 의미 1:월요일~7:일요일)

=========================================


여기서는 그냥 다 * 로 처리했습니다. 


이렇게 해두면 매 1분마다 실행 됩니다.


좀전에 만들었던 test1.sh 파일을 경로와 함께 작성합니다.


해당 경로의 쉘 파일을 실행하겠다는 의미입니다.


Esc를 누르고 :wq 를 눌러 저장하고 나옵니다.

  • crontab -l 


명령어를 사용하여 크론탭 예약리스트를 다시 확인해봅시다.



잘 된 것 같습니다.


검증

  • tail -100f /var/log/cron

명령어를 입력하면 크론탭이 제대로 작동하고 있는지 로그가 나옵니다.


매 1분마다 /usr/test1.sh 이 실행되었다는 의미입니다.

그런데 실제로 저와 같이 따라하셨다면


현재 창에 아까전처럼 "hello_world" 라는 메시지가 뜨지 않는다는 사실을 깨닫게 됩니다.

crontab 출력은 작업을 돌리기로 한 사용자의 메일함으로 갑니다.

메일함은 어딨있을까요 ?

  • /var/spool/mail

이 폴더 안에 root라는 파일을 열어보시면
root 계정(현재 제 계정) 앞으로 온 메일들이 있습니다.
  •  cd /var/spool/mail

명령어를 입력한 후에 view root 명령어를 입력 하였을 때 입니다.

불필요한 부분은 지워두었고, 밑줄되어 있는 부분을 보면
1분마다 hello_world 라는 문자열이 메일로 온 것을 확인할 수 있습니다.

이건 그냥 출력하는 쉘 파일을 만들어서 해당 파일을 크론탭 스케쥴러를 통해 실행이 되는지 확인 정도만 해 본 간단한 배치 + 스케쥴러 등록 방법이었습니다.

================= 추가 정보 ===================

rm -f 파일명

이 명령어는 특정 파일명을 가진 파일을 지우겠다는 명령어 입니다.
여기에 조건문을 걸어서 특정일 혹은 해당 일자 이후/이전 파일을 지우겠다 라는 내용을 쉘 파일에 작성해둔다면...?

아마 스케쥴러가 작동하여 해당하는 파일을 삭제하는 쉘을 실행시켜서 결과적으로 해당 파일을 지우게 되겠죠..

이런 원리로 시간이 오래 지나서 더이상 볼 필요가 없는 로그 파일을 삭제하는 배치 프로그램을 생성하여 사용하기도 합니다.