본문 바로가기
C++ 200제/코딩 IT 정보

[Crontab] C# Quartz Cron 사용법 - 초 시 분 월 주 달 표현식

by vicddory 2017. 3. 12.

C# Quartz 쿼츠나 크론과 관련된 내용은 여기서 다루지 않고 실제 C#에서 사용하기 위한 소스 예제만을 다룹니다. Cron(또는 Crontab)에서 제공하는 표현식은, 시간별, 일별, 주별, 월별인데, 약간의 꼼수(?)를 발휘해 초 간격의 표현식도 만들 수 있습니다.


가장 낮은 단위부터 생성 소스를 소개합니다.


c# quartz cron 문법quartz cron 구동 방식 정리 - 클래스 기준


C# Quartz 1. 초 간격의 표현식 사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// "0/5 * * * * ?"
public static string GetEverySecond(int second)
{
    string result = string.Empty;
 
    if (second > -1 && second < 60)
    {
        result += "0/" + second.ToString() + " * * * * ?";
        return result;
    }
    else
    {
        return null;
    }
}
cs


"0/5 * * * *" 이런 표현식은 5초 마다 동작하겠다는 의미입니다. 그래서 Crontab 함수 인자로 초를 받습니다.

C# Quartz 2. 몇 시 몇 분 사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 0 0 0/1 1/1 * ?
public static string GetEveryHour(int minute)
{
    string result = string.Empty;
    
    if (minute > -1 && minute < 60)
    {
        result = "0 ";
        result += minute.ToString();
        result += " 0/1 1/1 * ?";
        return result;
    }
    else
    {
        return null;
    }
}
cs


"0 3 0/1 1/1 * ?" 이 표현식은 매 시, 몇 분에 동작하겠다는 의미죠. 그래서 분에 해당하는 인자를 받습니다.


  • 1시 3분
  • 2시 3분
  • 3시 3분
  • ...


C# Quartz 3. 매일 몇 시 몇 분 사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public static string GetEveryDay(DateTime dateTime)
{
    //0  4-6   *  *  *  명령어 => 매일 오후 4,5,6시
    try
    {
        if (DateTimeChecker(dateTime) == false)
            return null;
        string result = string.Empty;
        result = "0 ";
        result += dateTime.Minute.ToString();
        result += " ";
        result += dateTime.Hour.ToString();
        result += " 1/1 * ?";
        return result;
    }
    catch (Exception e)
    {
        return null;
    }
}
 
public static string GetEveryDay(int hour, int minute)
{
    //0  4-6   *  *  *  명령어 => 매일 오후 4,5,6시
    try
    {
        if (hour > 24 || hour < 1 || minute > 59 || minute < 0)
        {
            return null;
        }
        else
        {
            string result = string.Empty;
            result = "0 ";
            result += minute.ToString();
            result += " ";
            result += hour.ToString();
            result += " 1/1 * ?";
            return result;
        }
    }
    catch (Exception e)
    {
        return null;
    }
}
cs


"0 6 2 1/1 * ?" 이 표현식은 매일 2시 6분에 동작하겠다는 의미입니다. 함수 인자는 DateTime나 int형 변수 2개를 받는 형태입니다. Crontab 표현식으로 봤을 땐, 둘 다 똑같아요.



C# Quartz 4. 일주일에 한 번 사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public static string GetEveryWeek(DayOfWeek day, DateTime dateTime)
{
    // 1. 요일 검사, 0~6,
    if ((int)day > 6 && (int)day < 0)
        return null;
    // 2. 시, 분 검사
    if (DateTimeChecker(dateTime) == false)
        return null;
    string daySplit = day.ToString().Substring(03).ToUpper();
 
    if (string.IsNullOrEmpty(daySplit) == true)
    {
        return null;
    }
    string result = string.Empty;
    // 0 45 15     Wednesday *
    // 0 45 15 ? * THU *
    result = "0 ";
    result += dateTime.Minute.ToString();
    result += " ";
    result += dateTime.Hour.ToString();
    result += " ? * ";
    result += daySplit;
    result += " *";
    return result;
}
 
public static string GetEveryWeek(DayOfWeek day, int hour, int minute)
{
    // 1. 요일 검사, 0~6,
    if ((int)day > 6 && (int)day < 0)
        return null;
    // 2. 시, 분 검사
    if (hour > 24 || hour < 1 || minute > 59 || minute < 0)
        return null;
    string daySplit = day.ToString().Substring(03).ToUpper();
 
    if (string.IsNullOrEmpty(daySplit) == true)
    {
        return null;
    }
    string result = string.Empty;
    // 0 45 15     Wednesday *
    // 0 45 15 ? * THU *
    result = "0 ";
    result += minute.ToString();
    result += " ";
    result += hour.ToString();
    result += " ? * ";
    result += daySplit;
    result += " *";
    return result;
}
cs

C# Quartz 5. 한달에 한 번 사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public static string GetEveryMonth(int date, DateTime time)
{
    // 1. day 검사
    if (date > 30 && date < 1)
        return null;
    // 2.월, 시, 분 검사
    if (DateTimeChecker(time) == false)
        return null;
    //15 1 1 * * 명령어 => 매월 1일 새벽 1:15
    string result = string.Empty;
    result += time.Second.ToString();
    result += " ";
    result += time.Minute.ToString();
    result += " ";
    result += time.Hour.ToString();
    result += " ";
    result += date.ToString();
    result += " ";
    result += "1/1";
    result += " ? *";
    return result;
}
public static string GetEveryMonth(int date, int hour, int minute)
{
    // 1. day 검사
    if (date > 30 && date < 1)
        return null;
    // 2.월, 시, 분 검사
    if (hour > 24 || hour < 1 || minute > 59 || minute < 0)
        return null;
    //15 1 1 * * 명령어 => 매월 1일 새벽 1:15
    string result = string.Empty;
    result += "0 ";
    result += minute.ToString();
    result += " ";
    result += hour.ToString();
    result += " ";
    result += date.ToString();
    result += " ";
    result += "1/1";
    result += " ? *";
    return result;
}
cs


이상 5개의 기능을 소개했고, 저는 Crontab 크론 문법 확인하는 용도로 아래 사이트를 이용합니다.



cron maker c# quartz[C# 스케줄러 cron 표현식]


제가 여기서 다뤄보니 100% 확실하다는 것을 알았습니다.


Cron 문법을 만들어주는 사이트가 저기 말고도 몇 군데 있는데, 저곳 표현식만 100% 들어맞고 다른 곳은 안 되는 경우가 종종 생기더라고요. 무조건 CronMaker.com 이용하시길 추천합니다. Crontab 표현식 만들어주는 사이트 중에선 최고입니다.


관련 글

C# 스케줄러 Quartz.net 사용 방법 (Cron 포함)

C# Quartz 스케줄러, 초 단위 설정 Cron 문법 (닷넷 타이머 예제 소스)

임베디드 리눅스 시스템, 교차 개발 환경과 부트로더

LVDT 응용, 실시간 모니터링 위한 시스템 통신 구성

자바 쓰레드 안전성을 위한 동기화, 캡슐화 (thread safety 방법)

[삼성바다 IT상식] OS, PLATFORM 차이

댓글