리눅스 서버에서 명령어들을 조합해 파일 검색, 프로세스 감시, 네트워크 점검까지 마스터하고 나면 문득 이런 생각이 들기 마련입니다. "매일 새벽 3시에 서버 상태 로그를 백업하고 싶은데, 설마 그때마다 알람을 맞추고 일어나서 터미널을 켜야 하는 걸까?" 당연히 아닙니다.
리눅스에는 우리가 침대에 누워 달콤한 잠을 자고 있는 시간에도, 혹은 주말에 여행을 떠나 있는 동안에도 정해진 시간에 맞춰 스스로 명령어를 실행하는 완벽한 인공지능 비서가 내장되어 있습니다. 그것이 바로 '크론탭(crontab)'입니다. 주기적인 데이터 백업, 불필요한 임시 파일 청소, 매주 진행하는 시스템 점검 등 반복되는 모든 귀찮은 일들을 컴퓨터에 넘겨버리는 리눅스 자동화 스케줄러의 핵심 사용법을 아주 쉽게 풀어드리겠습니다.
1. 크론탭의 개념과 비서에게 일 시키는 법
크론탭(crontab)은 'cron table'의 약자로, 리눅스의 백그라운드에서 상시 대기하며 시간을 감시하는 'cron'이라는 서비스에게 "몇 년 몇 월 몇 일 몇 시에 이 일을 해줘"라고 적어두는 스케줄러 장부입니다.
이 장부를 열고 수정하는 명령어는 매우 간단합니다. 터미널에 다음과 같이 입력하면 됩니다.
crontab -e
여기서 -e는 Edit(편집)을 의미합니다. 이 명령어를 처음 실행하면 화면 하단에 어떤 편집기(nano, vim 등)를 쓸 것인지 번호를 고르라고 나오는데, 우리에게 가장 친숙한 1번(nano)을 선택하면 익숙한 텍스트 편집 창이 열립니다. 이 메모장 같은 공간에 우리가 원하는 시간 조건과 실행할 명령어를 규칙에 맞게 한 줄씩 적어주기만 하면 자동화 세팅이 끝납니다. 현재 등록된 자동화 목록을 구경만 하고 싶다면 crontab -l (List)을 치면 됩니다.
2. 초보자가 가장 헷갈려하는 크론탭의 별 5개( * * * * * ) 암호문
crontab -e를 열고 들어갔을 때 입문자들이 가장 먼저 당황하는 부분이 바로 시간을 지정하는 독특한 문법입니다. 크론탭은 숫자가 아니라 하이픈이나 별 기호 5개를 나열해서 시간을 정의합니다.
왼쪽부터 오른쪽으로 순서대로 다음과 같은 의미를 가집니다.
* * * * * [실행할 명령어]
첫 번째 별: 분 (0 ~ 59)
두 번째 별: 시 (0 ~ 23)
세 번째 별: 일 (1 ~ 31)
네 번째 별: 월 (1 ~ 12)
다섯 번째 별: 요일 (0 ~ 6, 0은 일요일, 6은 토요일)
별 기호(*)는 '매번, 모든'이라는 뜻을 가집니다. 예를 들어 별 5개를 다 찍고 명령어를 쓰면 '매월 매일 매시 매분마다' 그 명령어를 무한 반복하라는 뜻이 됩니다. 시스템에 엄청난 무리가 가겠죠? 실무에서 쓰는 구체적인 예시로 풀어보겠습니다.
30 3 * * * [명령어]: 매일 새벽 3시 30분에 명령어를 실행해라. (분과 시만 지정하고 나머지는 별)0 0 * * 1 [명령어]: 매주 월요일(1) 자정(0시 0분)에 정기 점검 명령어를 실행해라.*/10 * * * * [명령어]: 슬래시 기호는 간격을 뜻합니다. 즉, 10분 간격으로 계속 실행해라.
처음에는 이 칸수를 맞추는 게 어색해서 헷갈리기 쉽지만, 몇 번만 타이핑해 보면 윈도우의 스케줄러보다 훨씬 정교하고 직관적으로 수 초 만에 시간을 세팅할 수 있는 강력한 무기임을 깨닫게 됩니다.
3. 내가 만든 크론탭이 작동하지 않는 결정적 이유: 환경 변수와 경로
많은 초보 엔지니어들이 크론탭을 공부하고 "매 분마다 test.txt 파일을 만드는 명령어"를 등록해 두고 기다립니다. 그런데 시간이 지나도 파일이 생성되지 않는 미스터리한 상황을 겪게 됩니다. 터미널에 직접 치면 잘만 되던 명령어가 크론탭 장부에만 들어가면 벙어리가 되는 이유는 무엇일까요?
가장 큰 원인은 '경로(Path)의 차이'에 있습니다. 우리가 터미널에 로그인해서 명령어를 칠 때는 앞선 글에서 배웠던 환경 변수($PATH)들이 자동으로 로드되어 컴퓨터가 명령어들의 위치를 다 알고 있습니다. 하지만 크론탭이라는 비서는 아주 최소한의 옷만 입고 독립된 방에서 작동하기 때문에, ls나 mkdir 같은 기본 명령어조차 어디에 숨어있는지 찾지 못하는 경우가 많습니다.
따라서 크론탭에 명령어를 적을 때는 반드시 '절대 경로'를 적어주는 철칙을 지켜야 합니다.
예를 들어 그냥 sh backup.sh라고 적으면 실패합니다. 대신 which sh 명령어로 sh 프로그램의 진짜 위치를 찾아서 /bin/sh /home/ubuntu/backup.sh와 같이 처음부터 끝까지 완전한 주소를 다 적어주어야 비서가 길을 잃지 않고 정확하게 임무를 수행합니다.
크론탭을 운영할 때 초보자가 가져야 할 안전 규칙
내가 처음 서버에 자동 백업 크론탭을 등록했을 때, 매일 새벽에 백업 성공 여부를 알리는 시스템 메일 텍스트가 서버 내부 디스크에 수천 개씩 쌓여 정작 서버 용량이 가득 차 다운되는 황당한 버그를 겪은 적이 있습니다. 크론탭은 명령어가 실행될 때마다 그 결과나 에러 메시지를 시스템 어딘가에 자꾸 기록하려는 성질이 있기 때문입니다.
따라서 크론탭을 등록할 때는 쓸데없는 쓰레기 데이터가 서버에 쌓이지 않도록 출력을 지워버리는 보호 장치를 명령어 끝에 달아주는 것이 좋습니다.
30 3 * * * /home/ubuntu/backup.sh > /dev/null 2>&1
명령어 뒤에 붙은 > /dev/null 2>&1이라는 문장은 "이 명령어에서 나오는 모든 정상 출력과 에러 메시지를 dev/null이라는 리눅스의 가상 블랙홀(휴지통)로 던져서 소멸시켜라"라는 뜻입니다. 화면에 아무것도 남기지 않고 조용히 일만 하라는 표준 약속입니다. 이 규칙만 명령어 끝에 잘 붙여두어도 서버 디스크가 알 수 없는 잔여 로그로 폭발하는 대참사를 완벽하게 예방할 수 있습니다.
👉 핵심 요약
crontab -e명령어를 통해 정해진 시간이나 주기마다 명령어를 자동으로 실행해 주는 예약 장부를 편집할 수 있습니다.크론탭의 시간 표현식은
분 시 일 월 요일순서로 5개의 별 기호를 조합하여 정밀하게 주기를 통제합니다.크론탭 비서는 일반 터미널과 환경 변수가 다르므로, 명령어나 스크립트를 등록할 때 반드시 프로그램의 '절대 경로'를 기재해야 오작동을 막을 수 있습니다.
자동 작업에서 발생하는 불필요한 출력이나 에러 로그가 디스크를 채우지 않도록 명령어 끝에
> /dev/null 2>&1블랙홀 처리 코드를 붙여주는 것이 안전합니다.
💢 다음 편 예고
컴퓨터가 스스로 일하게 만드는 자동화 스케줄러까지 다루셨으니, 이제 리눅스 기초 대단원의 마지막 장에 도달했습니다. 다음 글에서는 본 시리즈의 최종 편으로서, 지금까지 배웠던 핵심 가치들을 총망라하여 실제 웹서버(Nginx)를 직접 구동하고 모니터링하는 '초보자를 위한 가상 서버 구축 및 리눅스 실전 활용 종합 실습 가이드'를 통해 유종의 미를 거두어 보겠습니다.
여러분 만의 자동화 비서가 있다면 매일 새벽 컴퓨터가 대신 처리해 주었으면 하는 '가장 귀찮은 반복 작업'은 무엇인가요? 생각나는 아이디어를 댓글로 편하게 적어주세요!
0 댓글