본문 바로가기

linux/centos

반복적으로 작업을 실행하고 싶을 때 - crontab

centos 서버에 서비스를 올려서 돌리는 것까지는 했는데 서버라는 것이 생각보다 손이 많이 갑니다. 서비스가 잘 동작하고 있는지, 리소스 상태가 어떤지, 에러 로그가 있는지 등을 지속적으로 체크해야 합니다. 그런데 서버를 띄워놓고 계속 들여다 볼 수가 없으니 내버려 두고 다른 일들을 열심히 하다가 문제가 발생하면 그제서야 미안하다/죄송하다는 말과 함께 원인을 찾고 재발방지를 위한 조치를 하게 됩니다. 적다보니 너무 슬퍼지네요. 😢

그래도 우리의 장점은 이런 과정들을 개선하기 위해 노력한다는 점이겠죠?! 그렇기때문에 오늘은 crontab을 통해 여러가지 상황을 대응하는 방법에 대해 알아보겠습니다.

 

crontab 알아보기

crontab -h

invalid option 인데 설명을 해주다니 친절하군요!

-l 로 등록되어 있는 crontab 목록을 조회할 수 있고, -e로 등록할 수 있고, -r로 지울 수 있다는 것이 눈에 띕니다. 이를 통해 간단히 crontab을 사용해볼까요?!

crontab -l

root를 위한 crontab은 없습니다. 아직!

 

crontab 등록 하기

무엇을 반복해보면 좋을까요?! 날짜/시간을 출력해볼까요? 우선 crontab을 편집합니다.

crontab -e

저는 vi 편집기 화면이 뜨네요. 여기에 1분마다 날짜/시간을 출력하도록 입력해보겠습니다.

대충 입력해봅니다.

저장하고 나온 후 목록을 다시 조회해볼까요?

나옵니다! 나와욧~!

그런데 1분마다 동작을 하고는 있는지 알 수가 없네요. date 치면 아래처럼 나와야 하는데 말이죠.

1분마다 이렇게 출력될 줄 알았는데?!

 

crontab 로그 확인 하기

동작은 하는지 궁금하므로 로그를 확인해봅니다. crontab의 로그는 /var/log/cron 에서 확인 할 수 있습니다.

cat /var/log/cron

UTC 시간으로 기록되는 것 같아서 좀 이상하지만 root 계정으로 date를 1분마다 수행하고는 있는 것으로 보입니다. crontab에 입력한 내용이 잘 수행되는 것 같네요. 그렇지만 우리가 원하는 date 결과를 볼 수 있으면 좋겠습니다. date 내용을 파일에 기록하고 파일 내용을 확인해보겠습니다. 다시 crontab -e로 내용을 편집합니다.

crontab.log 파일에 date 결과를 입력합니다.

너무 막 만들었네요. crontab.log 파일을 찾아봅니다.

find / -name crontab.log

crontab.log 파일 찾기

찾았으니 내용을 출력해볼까요?

cat /root/crontab.log

내용이 1분 간격으로 기록되고 있는 것 같습니다.

tail -f 명령으로 1분마다 기록되는 내용을 실시간으로 확인 할 수도 있습니다.

tail -f /root/crontab.log

또는 /var/log/cron을 모니터링 할 수도 있겠죠?! 어쨌든 동작을 테스트 한 것이므로 삭제 해야 합니다.

 

crontab 삭제

삭제는 심플하게 -r 명령으로 수행할 수 있습니다.

crontab -r

없는데 지우려고 하거나 조회하려 하면 메세지가 나오네요.

너무 간단하게 사라지는 것 같아서 불안하신가요?! 그렇다면 crontab을 백업해놓는 방법까지는 익히면 좋습니다.

 

crontab 백업

앞에서 살펴본 것처럼 crontab에는 백업 기능이 없습니다. 리눅스의 표준 출력 기능을 통해 현재 crontab의 내용을 파일에 기록할 수 있습니다. 👍 (아래에서는 그냥 crontab.bak으로 기록하지만 특정 폴더를 잘 정의해야 합니다.)

crontab -l >> crontab.bak

기록이 잘 되는데 언제 어떤 crontab의 내용인지 구분하기가 어렵습니다.

crontab.bak 파일만 사용하기에 이런 혼선이 생길 수 있습니다.

한 번 더 백업 한 내용인데 구분이 잘 안될 것 같은 느낌입니다.

그래서 crontab_날짜.bak 형식으로 백업을 하면 어떨까요?!

crontab -l >> crontab_$(date '+%Y%m%d').bak

날짜가 들어가니 구분이 되는 것 같습니다. 그런데 파일이 계속 늘어날 수도 있겠군요. ㅠ_ㅠ

이 정도 되었으면 이 스크립트를 crontab으로 등록해서 주기적으로 백업 하도록 해줄 수도 있겠습니다. (백업을 위한 추가 crontab!!) 

점점 A를 위한 B, B를 위한 C... 쳇바퀴에 빠진 것 같은 느낌이 ㅋㅋ

그리고 앞서 우려했던 파일이 매일 늘어나므로 15일 전 파일은 삭제 하도록 설정 할 수도 있겠습니다. 너무 과한가요.

find /root/ -mtime +15 -exec rm -rf {} \;

find로 15일보다 더 과거의 파일을 찾아서 지웁니다. /root/ 경로는 crontab.log가 쌓이는 폴더로 잘 설정해 주면 됩니다. 그리고 이 것도 crontab으로 등록해서 자동으로 특정 시간에 수행되도록 해줍니다. ㅋㅋㅋ 진짜 여기까지가 끝입니다.

 

저와 비슷한 문제를 겪으셨나요? 제가 겪은 다른 문제 및 해결 방법에 대한 내용도 도움이 되시면 좋겠습니다.

도움이 되셨다면 공감 및 댓글 부탁드려도 될까요?! 관심은 저를 행복하게 해 줍니다.