리눅스에서 크론 사용하기 초보자 가이드

크론(Cron)은 컴퓨터에서 명령의 실행을 관리하고 예약하는 간단한 UNIX 유틸리티입니다. 1987년 폴 빅시(Paul Vixie)에 의해 처음 개발되었으며, 이후 리눅스 기반 운영 체제에서 관리자와 사용자 모두에게 필수 도구가 되었습니다.
현재 리눅스 시스템에 쉽게 설치할 수 있는 여러 크론 구현체와 리라이트가 있습니다. 차이점이 있음에도 불구하고 이들 프로그램은 모두 같은 Vixie Cron 혈통을 공유합니다.
따라서 이 글에서는 원래 Vixie 크론이 작동하는 방식, 문법, 그리고 리눅스 시스템에서 작업을 예약하는 방법에 대한 기본적인 개요를 제공하는 것을 목표로 합니다.
목차
- 크론은 어떻게 작동하나요?
- 크론탭: 크론의 핵심
- 시스템 크론탭
- 크론 활동 검토하기
- 자주 묻는 질문
또한 읽기: 리눅스에서 자이트와 함께 크론 작업을 쉽게 만드는 방법
크론은 어떻게 작동하나요?
크론은 믿을 수 없을 만큼 간단한 UNIX 유틸리티입니다. 두 부분으로 작동합니다. 크론은 먼저 시스템을 처음 부팅할 때 시작되는 백그라운드 프로세스로 실행됩니다.
거기서부터 매 분마다 특정 파일을 읽습니다. 이 파일에는 실행하려는 각 스크립트나 프로그램에 대한 시간 코드와 파일 경로를 포함하는 명령 목록이 포함되어 있습니다.

이 접근 방식 덕분에 크론은 대규모 시스템에서 매우 유연합니다. 예를 들어, 현대 크론 구현체인 크로니(Cronie)는 해당 기계가 여러 사용자를 호스트하더라도 단일 인스턴스의 크론만 실행합니다.

크로니는 시스템에 설치된 각 사용자에 대한 로컬 크론탭을 제공하여 이를 가능하게 합니다. 따라서 크론은 크론탭을 소유한 사용자, 해당 사용자의 권한 수준, 그리고 크론탭 내부의 명령만 아는 것으로 충분합니다.
이는 시스템을 더 효율적으로 만들뿐만 아니라 메모리에서 실행되는 특권 프로그램의 수를 줄여 보안을 개선합니다.
크론탭: 크론의 핵심
모든 크론 구현체는 어떤 형태의 크론탭을 사용합니다. 이것은 특정 사용자가 크론이 실행할 모든 명령을 포함하는 간단한 텍스트 파일입니다. 위에서 설명한 대로, 시스템의 각 사용자는 자신의 크론탭을 가지고 있습니다. 그들은 다음 명령어를 실행하여 이를 볼 수 있습니다:
crontab -l
이 명령은 현재 사용자의 크론탭 내용을 표준 출력으로 출력합니다. 이는 사용자가 크론이 그 사용자에 대해 어떤 명령을 실행하고 있는지 빠르게 확인하고 싶을 때 매우 유용합니다.
편집하려면 다음 명령어를 실행해야 합니다:
crontab -e이렇게 하면 크론이 기본 텍스트 편집기를 실행하고 그 안에 크론탭 파일을 로드하게 됩니다. 이를 통해 크론탭 파일을 편집할 수 있습니다.

또한 읽기: 시스템d 타이머를 크론 대체로 사용하는 방법
크론탭 문법
크론탭 파일의 문법은 매우 간단합니다. 이 파일의 한 줄은 해당 특정 사용자가 실행해야 할 명령을 나타냅니다. 크론탭 명령의 일반 형식은 다음과 같습니다:
m h d mon dow [flags]command시간 간격은 5자리 필드로 구성되어 있으며, 크론에 얼마나 자주 명령을 실행하고 싶은지를 알려줍니다. 이는 모든 크론 구현의 핵심 기능이며, 크론이 반복되는 작업을 처리하는 방식에서 구체적이고 유연하게 할 수 있게 해줍니다.
- m = 분 (0과 59 사이)
- h = 시간 (0과 23 사이)
- d = 월의 날 (1과 31 사이)
- mon = 월 (1과 12 사이)
- dow = 주의 날 (0과 6 사이. 0은 일요일입니다.)
flags 필드는 단일 명령에 대해 크론의 동작 방식을 수정하는 옵션 세트입니다. 예를 들어, -n 옵션을 포함하여 크론이 시스템 메일을 보내지 않도록 할 수 있습니다.
command 필드는 크론이 정해진 간격으로 실행할 명령입니다. 이 명령은 본인이 작성한 셸 스크립트이거나 플래그가 있는 프로그램 경로일 수 있습니다.

이를 이용하여 모든 것을 하나의 크론탭 줄에 결합하여 작업에 대한 특정 시간 간격을 생성할 수 있습니다. 예를 들어, 매년 7월 24일 오전 2시 30분에 Ubuntu 시스템에서 스크립트를 실행하려면 다음과 같은 크론탭 줄을 작성할 수 있습니다:
302247*/home/$USER/myscript.sh
참고: 크론 작업이 서로 겹치지 않도록 “드문” 숫자(11, 27, 34 등)로 크론 작업을 실행하는 것이 권장됩니다.
짧은 코드들
크론탭은 크론 항목을 보다 읽기 쉽게 하도록 몇 가지 짧은 코드를 사용할 수 있습니다.
@reboot– 부팅 시 한 번 실행@yearly– 매년 한 번 실행, “0 0 1 1 *”.@annually– @yearly와 동일@monthly– 매월 한 번 실행, “0 0 1 ”@weekly– 매주 한 번 실행, “0 0 0”@daily– 매일 한 번 실행, “0 0 *”@midnight– @daily와 동일@hourly– 매시간 한 번 실행, “0 ”
예를 들어:
@daily ramces /home/ramces/.scripts/file-backup.sh@reboot 단축 코드는 시작 시 실행할 스크립트를 만들 수 있게 해줍니다:
@reboot /home/ramces/.scripts/bootup.sh기계를 켤 때 명령이 즉시 실행되도록 보장하는 방법을 만들고 싶다면 매우 유용할 수 있습니다.
참고: 시스템 설정에 따라 @reboot 단축 코드가 의도한 대로 작동하지 않을 수 있습니다.
시스템 크론탭
크론의 또 다른 훌륭한 기능은 루트 크론탭 파일을 생성하여 시스템 전체 작업을 관리할 수 있다는 점입니다. 이는 시스템 유지 보수 및 업데이트를 자동화하고 싶을 때 매우 유용합니다.
루트 크론탭을 생성하려면 명령어와 함께 sudo를 사용하거나 루트 계정으로 로그인하기만 하면 됩니다:
sudo crontab -e
시스템 크론탭은 사용자 크론탭과 거의 동일한 형식을 따릅니다. 그러나 두 가지의 주요 차이점은 루트 크론탭이 시스템 내의 모든 사용자의 명령을 실행할 수 있게 한다는 점입니다:
m h d mon dow user [flags]"command"이를 통해 동일한 크론탭 내에서 사용자 및 루트 수준 반복 명령을 모두 생성할 수 있습니다:
302 sun root /bin/apt update
305* ramces /home/ramces/.scripts/file-backup.sh이렇게 하면 파일의 권한을 유지하면서 실행할 명령을 편집할 수 있는 단일 장소를 가질 수 있습니다.

또한 읽기: 리눅스에서 sudoers 파일을 편집하는 이유와 방법
다른 사용자로서 크론 항목 편집하기
루트 사용자로서 크론탭을 편집하는 대신 다른 사용자로서 크론 작업을 예약하고 싶다면 -u 플래그를 사용할 수 있습니다.
sudo crontab -u username -e예를 들어 “www-data” 사용자의 크론 작업을 실행하려면 다음 명령을 사용하십시오:
sudo crontab -u www-data -e또한 읽기: 리눅스에서 터미널 출력을 파일로 저장하는 방법
크론 활동 검토하기
이제 특정 명령이나 스크립트를 실행할 준비가 되었지만, 그것이 실행되었는지 확인하고 싶을 수 있습니다. 크론에 내장되어 있는 것은 한 번 명령이 실행되면 크론 소유자에게 이메일을 보낼 것입니다. 이는 “MAILTO” 변수로 변경할 수 있습니다.

[email protected]을 추가하면 모든 크론 작업 보고서가 지정한 이메일로 전송됩니다. 이 변수는 일반적으로 크론탭 편집 화면의 가장 위쪽에서 찾을 수 있습니다. 그러나 거기 없다면 변수를 추가하면 예상대로 작동할 것입니다.
여러 개의 이메일 주소는 쉼표로 구분할 수 있습니다. 필요한 다른 명령이 다른 곳으로 이메일로 발송되길 원한다면, 해당 명령 바로 위에 MAILTO 명령을 추가할 수 있습니다. 이후 그 MAILTO 뒤에 있는 명령들은 새로운 주소로 이메일이 전송됩니다. MAILTO=를 비워두면, 알림은 크론 항목의 소유자에게 전송됩니다.
아무 이메일도 받고 싶지 않다면, 크론 로그를 확인할 수도 있습니다. 대부분의 시스템에서는 크론 로그에 접근하려면 슈퍼유저 권한이 필요합니다. 크론 로그는 “/var/log” 아래에서 찾을 수 있습니다. 크론 또는 syslog 파일은 실행된 크론 항목의 로그를 표시합니다.
sudo grep crontab syslog자주 묻는 질문
내 크론 명령이 매 분마다 실행되는데, 한 시간마다 한 번이 아니라?
이는 크론탭을 관리할 때 가장 흔한 실수 중 하나입니다. 기본적으로, 시간 코드에 별표 값을 추가하면 해당 값에 대해 가능한 모든 인스턴스에서 실행될 것이라는 의미입니다. 예를 들어, 값 0 12 * * *는 크론에게 하루에 한 번 오후 12시 0분에 명령을 실행하고 싶다는 의미입니다.
하지만 많은 초보자들이 동일한 시간 코드를 * 12 * * *로 작성합니다. 이렇게 작성하면 명령이 오후 12시 0분부터 12시 59분까지 매 분마다 실행됩니다. 따라서 분 필드에 0을 작성하는 것이 좋은 습관입니다. 그래야만 명령이 단 한 번만 실행됩니다.
크론과 함께 사용할 수 있는 다른 옵션이 있나요?
-n 및 MAILTO 변수를 제외하고, -s 명령을 사용할 수 있어 프로그램이 명령 실행 시 엄격하게 동작하도록 유도할 수 있습니다. 이 옵션을 사용하면 크론이 현재 명령에만 집중하도록 강제하여 완료될 때까지 기다리게 됩니다. 이는 특정 순서로 실행해야 할 명령을 사용하는 경우 매우 유용할 수 있습니다.
또한 SHELL 변수를 사용하여 크론이 명령에 대해 다른 셸을 사용하도록 설정할 수 있습니다. 예를 들어: SHELL=/bin/ksh
이미지 크레디트: Unsplash