⏰ Cron 표현식 생성기 (Cron Generator)
Cron 표현식을 쉽게 생성하고 이해하세요. 주기적인 작업 스케줄링을 위한 Cron 문법을 시각적으로 만들고 테스트할 수 있습니다.
⏰ Cron Expression Generator
Generate and validate cron expressions with ease
🔧 Build Cron Expression
📝 Cron Expression
📚 Common Presets
ℹ️ Cron Expression Guide
⭐ Special Characters
- * - Any value
- , - Value list (e.g., 1,3,5)
- - - Range (e.g., 1-5)
- / - Step values (e.g., */5)
📅 Day of Week
- 0 or 7 - Sunday
- 1 - Monday
- 2 - Tuesday
- 3-6 - Wed-Sat
📖 Examples
- */5 * * * * - Every 5 minutes
- 0 9 * * 1-5 - Weekdays at 9 AM
- 0 0 1 * * - First of month
⚙️ Use Cases
- Schedule automated tasks
- Configure CI/CD pipelines
- Set up backup schedules
- Trigger periodic jobs
📚 Cron이란?
Cron은 유닉스/리눅스 시스템에서 특정 시간에 작업을 자동으로 실행하기 위한 시간 기반 작업 스케줄러입니다. Cron 표현식은 작업 실행 시간을 정의하는 문자열 형식으로, 분, 시, 일, 월, 요일 등을 지정할 수 있습니다.
🎯 Cron의 장점
- 자동화 - 반복 작업을 자동으로 실행하여 수동 개입을 최소화합니다
- 정확성 - 정해진 시간에 정확하게 작업을 실행합니다
- 효율성 - 서버 리소스를 효율적으로 사용할 수 있습니다
- 표준화 - 대부분의 리눅스/유닉스 시스템에서 지원됩니다
- 유연성 - 복잡한 스케줄도 표현식으로 간단히 정의할 수 있습니다
📝 Cron 표현식 형식
기본 형식 (5필드)
(0-59)
(0-23)
(1-31)
(1-12)
(0-7)
확장 형식 (6필드 - 초 포함)
(0-59)
(0-59)
(0-23)
(1-31)
(1-12)
(0-7)
일부 시스템은 월/요일에 영문 약자(JAN, MON 등)도 지원합니다.
🔤 특수 문자
* (별표) - 모든 값
해당 필드의 모든 가능한 값을 의미합니다.
* * * * * - 매분 실행0 * * * * - 매시간 정각(0분)에 실행0 0 * * * - 매일 자정(00:00)에 실행, (쉼표) - 여러 값
여러 개의 특정 값을 지정합니다.
0 0 * * 1,3,5 - 월/수/금요일 자정에 실행0 9,12,18 * * * - 매일 9시, 12시, 18시에 실행0 0 1,15 * * - 매월 1일과 15일 자정에 실행- (하이픈) - 범위
값의 범위를 지정합니다.
0 9-17 * * * - 매일 9시부터 17시까지 매시간 실행0 0 * * 1-5 - 월요일부터 금요일까지 자정에 실행0 0 1-7 * * - 매월 1일부터 7일까지 자정에 실행/ (슬래시) - 증분
특정 간격으로 실행합니다.
*/5 * * * * - 5분마다 실행0 */2 * * * - 2시간마다 실행0 0 */3 * * - 3일마다 자정에 실행? (물음표) - 값 지정 안 함
일 또는 요일 필드에서만 사용. 한쪽만 지정할 때 다른 쪽에 사용합니다.
0 0 15 * ? - 매월 15일 자정 (요일 무관)0 0 ? * 1 - 매주 월요일 자정 (일 무관)L (Last) - 마지막
월의 마지막 날 또는 요일의 마지막 발생일을 의미합니다.
0 0 L * * - 매월 마지막 날 자정0 0 ? * 5L - 매월 마지막 금요일 자정W (Weekday) - 평일
가장 가까운 평일을 의미합니다.
0 0 15W * * - 15일에 가장 가까운 평일 자정# (해시) - N번째 요일
월의 N번째 특정 요일을 의미합니다.
0 0 ? * 1#2 - 매월 두 번째 월요일 자정0 0 ? * 5#1 - 매월 첫 번째 금요일 자정💡 자주 사용하는 패턴
| 표현식 | 설명 | 실행 시간 |
|---|---|---|
* * * * * | 매분 | 매일 00:00, 00:01, 00:02 ... |
*/5 * * * * | 5분마다 | 매일 00:00, 00:05, 00:10 ... |
0 * * * * | 매시간 | 매일 00:00, 01:00, 02:00 ... |
0 0 * * * | 매일 자정 | 매일 00:00 |
0 9 * * * | 매일 오전 9시 | 매일 09:00 |
0 9 * * 1-5 | 평일 오전 9시 | 월~금 09:00 |
0 0 * * 0 | 매주 일요일 자정 | 일요일 00:00 |
0 0 1 * * | 매월 1일 자정 | 매월 1일 00:00 |
0 0 1 1 * | 매년 1월 1일 자정 | 1월 1일 00:00 |
0 */6 * * * | 6시간마다 | 00:00, 06:00, 12:00, 18:00 |
30 2 * * * | 매일 새벽 2시 30분 | 매일 02:30 |
0 9-17 * * 1-5 | 평일 업무시간 매시간 | 월~금 09:00-17:00 매시간 |
🎯 사용 사례
1. 데이터베이스 백업
매일 새벽 시간대에 자동으로 데이터베이스를 백업합니다. 트래픽이 적은 시간을 선택하여 서비스에 영향을 최소화합니다.
0 3 * * * - 매일 새벽 3시에 백업0 2 * * 0 - 매주 일요일 새벽 2시에 전체 백업2. 로그 파일 정리
오래된 로그 파일을 주기적으로 삭제하여 디스크 공간을 확보합니다. 보통 매일 또는 매주 특정 시간에 실행합니다.
0 0 * * * - 매일 자정에 30일 이상 된 로그 삭제3. 리포트 생성 및 전송
일일 매출 리포트, 주간 통계 등을 자동으로 생성하고 이메일로 전송합니다. 업무 시작 전에 리포트를 확인할 수 있도록 스케줄링합니다.
0 8 * * 1-5 - 평일 오전 8시에 일일 리포트 생성0 9 * * 1 - 매주 월요일 오전 9시에 주간 리포트 생성4. 시스템 모니터링
서버 상태, 디스크 사용량, CPU/메모리 사용률 등을 주기적으로 체크하고 임계값 초과 시 알림을 발송합니다.
*/5 * * * * - 5분마다 시스템 상태 체크5. 캐시 갱신
API 응답, 계산 결과 등을 캐시하고 주기적으로 갱신하여 사용자에게 최신 데이터를 제공합니다.
*/10 * * * * - 10분마다 캐시 갱신💻 프로그래밍 예시
Linux Crontab
# crontab 편집
crontab -e
# 예시: 매일 새벽 2시에 백업 스크립트 실행
0 2 * * * /home/user/backup.sh
# 예시: 5분마다 로그 모니터링
*/5 * * * * /usr/local/bin/check-logs.sh
# crontab 확인
crontab -lNode.js (node-cron)
const cron = require('node-cron');
// 매일 자정에 실행
cron.schedule('0 0 * * *', () => {
console.log('데일리 작업 실행 중...');
// 작업 로직
});
// 평일 오전 9시에 실행
cron.schedule('0 9 * * 1-5', () => {
console.log('평일 업무 시작 작업 실행 중...');
});
// 5분마다 실행
cron.schedule('*/5 * * * *', () => {
console.log('5분 주기 작업 실행 중...');
});Python (APScheduler)
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
scheduler = BlockingScheduler()
# 매일 오전 9시 실행
@scheduler.scheduled_job(CronTrigger.from_crontab('0 9 * * *'))
def daily_task():
print("데일리 작업 실행 중...")
# 평일 매시간 실행
@scheduler.scheduled_job(CronTrigger.from_crontab('0 * * * 1-5'))
def hourly_weekday_task():
print("평일 시간당 작업 실행 중...")
scheduler.start()Spring Boot (@Scheduled)
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTasks {
// 매일 자정 실행
@Scheduled(cron = "0 0 0 * * *")
public void midnightTask() {
System.out.println("자정 작업 실행 중...");
}
// 평일 오전 9시 실행
@Scheduled(cron = "0 0 9 * * MON-FRI")
public void weekdayMorningTask() {
System.out.println("평일 아침 작업 실행 중...");
}
// 5분마다 실행
@Scheduled(cron = "0 */5 * * * *")
public void everyFiveMinutes() {
System.out.println("5분 주기 작업 실행 중...");
}
}❓ 자주 묻는 질문 (FAQ)
Q1. 초(seconds) 단위 스케줄링이 필요한데, Cron으로 가능한가요?
A. 전통적인 유닉스 Cron은 분 단위가 최소입니다. 하지만 일부 구현체는 초 단위를 지원합니다:
초 단위 지원:
• Spring Boot @Scheduled - 6필드 형식 (초 포함)
• Quartz Scheduler
• node-cron (확장 기능)
초 단위 미지원:
• Linux/Unix crontab
• 대부분의 표준 Cron 구현체
초 단위가 필요하면 while 루프와 sleep을 사용하거나, 초 단위를 지원하는 스케줄러 라이브러리를 사용하세요.
Q2. 0 0 31 2 * (2월 31일)처럼 존재하지 않는 날짜를 지정하면?
A. 절대 실행되지 않습니다. 2월은 최대 29일까지만 있으므로 31일은 존재하지 않습니다. 이런 경우 작업이 스케줄링되지만 실행 조건이 영원히 만족되지 않습니다.
매월 마지막 날에 실행하려면 L 특수 문자를 지원하는 시스템에서 0 0 L * *를 사용하거나, 스크립트에서 날짜를 직접 체크하는 방법을 사용하세요.
Q3. 일(day)과 요일(day of week)을 동시에 지정하면 어떻게 되나요?
A. OR 조건으로 동작합니다 (AND가 아님!).
예시: 0 0 13 * 5 (13일 또는 금요일)
→ 매월 13일 또는 매주 금요일에 실행 (둘 다 만족하지 않아도 됨)
13일이면서 금요일에만 실행하려면 스크립트 내부에서 조건을 직접 체크해야 합니다:0 0 * * 5 [ $(date +\%d) -eq 13 ] && /path/to/script.sh
보통은 일 또는 요일 중 하나만 지정하고, 다른 쪽은 * 또는 ?로 둡니다.
Q4. Cron 작업이 실행되지 않아요!
A. 다음 사항들을 확인하세요:
1. Cron 서비스 실행 여부:sudo service cron status (Ubuntu/Debian)sudo systemctl status crond (CentOS/RHEL)
2. Crontab 문법 오류:
온라인 Cron 검증 도구로 표현식을 확인하세요.
3. 스크립트 실행 권한:chmod +x /path/to/script.sh
4. 절대 경로 사용:
Cron은 환경변수가 제한적이므로 스크립트와 명령어에 절대 경로를 사용하세요.
5. 로그 확인:/var/log/syslog 또는 /var/log/cron에서 에러 확인
6. 출력 리다이렉트:0 0 * * * /script.sh >> /var/log/mycron.log 2>&1
Q5. */5와 0,5,10,15,...의 차이는?
A. 대부분 동일하지만, 미묘한 차이가 있습니다:*/5 * * * * - 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55분에 실행0,5,10,15,20,25,30,35,40,45,50,55 * * * * - 명시적으로 지정*/5는 더 간결하고 가독성이 좋습니다. 하지만 3-59/5처럼 시작점을 바꿀 수 있다는 장점이 있습니다:3-59/5 * * * * - 3, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58분에 실행
일반적으로는 */N 형식을 사용하는 것이 좋습니다.
Q6. 작업 실행 시간이 겹치면 어떻게 되나요?
A. 기본적으로 새 작업이 동시에 실행됩니다.
예시: 5분마다 실행되는 작업이 10분 걸린다면, 작업이 중복 실행됩니다:
• 00:00 - 작업 1 시작
• 00:05 - 작업 2 시작 (작업 1이 아직 실행 중)
• 00:10 - 작업 1 종료, 작업 3 시작
해결 방법:
1. Lock 파일 사용 - 스크립트에서 lock 파일 생성하여 중복 실행 방지
2. flock 명령어 사용 - * * * * * flock -n /tmp/cron.lock /script.sh
3. 작업 간격 조정 - 작업 실행 시간보다 긴 간격으로 스케줄링
💡 사용 팁
- 테스트: 중요한 작업은 먼저 짧은 간격(매분)으로 테스트 후 실제 스케줄로 변경하세요.
- 로그 기록: 작업 실행 결과를 로그 파일에 기록하여 디버깅을 쉽게 하세요.
- 알림 설정: 중요한 작업은 실패 시 이메일이나 Slack 알림을 보내도록 설정하세요.
- 시간대 확인: 서버의 시간대(Timezone)를 확인하고, 필요시 UTC로 설정하세요.
- 주석 추가: crontab에 각 작업의 목적을 주석으로 기록하세요.
- 백업: crontab 설정을 정기적으로 백업하세요 (
crontab -l > crontab-backup.txt). - 절대 경로: 스크립트와 명령어는 항상 절대 경로를 사용하세요.
- 환경 변수: crontab 내에서 필요한 환경 변수를 명시적으로 설정하세요.
- 검증 도구: crontab.guru 같은 온라인 도구로 표현식을 검증하세요.
⚠️ 주의사항
- 환경 변수: Cron은 제한된 환경에서 실행되므로 PATH 등 환경 변수가 다릅니다.
- 타임존: 서버 시간대를 확인하세요. UTC와 로컬 시간을 혼동하지 마세요.
- 중복 실행: 작업이 길어질 경우 다음 스케줄과 겹칠 수 있으니 lock을 사용하세요.
- 권한: 작업에 필요한 파일 및 디렉토리 권한을 확인하세요.
- 리소스: 너무 많은 작업을 동시에 스케줄링하면 시스템 부하가 증가합니다.
- 출력 관리: Cron 출력이 쌓이지 않도록
>/dev/null 2>&1또는 로그 파일로 리다이렉트하세요. - 여름시간(DST): 시간대가 DST를 사용하면 시간이 변경될 때 주의하세요.
- 재부팅:
@reboot를 제외한 Cron 작업은 시스템 재부팅 시 즉시 실행되지 않습니다. - 이메일 스팸: Cron 출력은 기본적으로 이메일로 전송되므로 불필요한 출력을 제거하세요.