read

이번에 Jenkins를 이전하는 작업중에
팀원분이 Jenkins Job 중에 1초마다 실행되는게 있다며 확인해보라고 하셨습니다.
“오잉?!” 뭔데 1초마다 실행되지? 하고 확인했더니 1분 단위였습니다.
왜 이런 오해가 생겼나 봤더니 @Scheduled 는 초마다 설정할 수 있어 젠킨스도 초단위부터라고 생각하신거였습니다.
그래서 정리해봤습니다.

요약

Type Desc.
@Scheduled 초 분 시간 일 월 요일
Cron 분 시간 일 월 요일
Jenkins 분 시간 일 월 요일

Cron

linux 시스템에서 사용하는 스케줄 작업 관련 데몬을 cron 이라고 합니다.
크론데몬 설정을 저장하는 crontab 을 알아보겠습니다.
주석은 #을 사용하고 한줄에 하나의 명령만 사용합니다.

분  시간  일  월  요일 

크론탭 설정된 목록을 보여줍니다.

$ crontab -l
35 * * * * /home/script/data_sync.sh

크론탭 편집, 삭제 명령입니다.

$ crontab -e // 편집
$ crontab -r // 삭제 (내용 전체 삭제)

크론탭 사용의 간략한 설명을 확인할때는 help 옵션을 사용하고, 자세한 설명이 필요할때는 man 명령어를 사용합니다.

$ crontab -help
$ man crontab
옵션 설명
0-59
시간 0–23
1–31
1–12 (1:1월 - 12: 12월)
요일 0–7 (1: 월요일 - 0, 7: 일요일)

크론탭 사용의 간략한 설명을 확인할때는 help 옵션을 사용하고, 자세한 설명이 필요할때는 man 명령어를 사용합니다.

$ crontab -help
$ man crontab

crontab 설정 samaple 을 살펴보겠습니다.

# use /bin/sh to run commands, no matter what /etc/passwd says
SHELL=/bin/sh
# mail any output to `paul', no matter whose crontab this is
MAILTO=paul
#
# run five minutes after midnight, every day
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1

# run at 2:15pm on the first of every month -- job output will be sent
# to paul, but only if $HOME/bin/monthly exits with a non-zero exit code
15 14 1 * *     -n $HOME/bin/monthly

# run at 10 pm on weekdays, annoy Joe
0 22 * * 1-5	mail -s "It's 10pm" joe%Joe,%%Where are your kids?%

23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"

5 4 * * sun     echo "run at 5 after 4 every sunday"

# run hourly at a random time within the first 30 minutes of the hour
0~30 * * * *   /usr/libexec/spamd-setup

참고 URls.

@Scheduled

초  분  시간  일  월  요일 

어노테이션 @Scheduled 설정 예시입니다.

@Scheduled(cron = "* * * * * *")  
@Scheduled(cron = "0 0 9 10 * ?", zone = "Asia/Seoul")

XML 방식 구성 scheduler 설정 예시입니다.

<task:scheduled-tasks scheduler="scheduler">
    <!-- 개인정보 이용내역 통지 매일 AM 9 -->
    <task:scheduled ref="userService" method="privateInfoUsageEmail" cron="0 0 9 * * *" />

    <!-- 데이터 동기화 10 단위 -->
    <task:scheduled ref="bService" method="syncData" cron="0 */10 * * * *" />

Cron Expressions

 ┌───────────── second (0-59)
 │ ┌───────────── minute (0 - 59)
 │ │ ┌───────────── hour (0 - 23)
 │ │ │ ┌───────────── day of the month (1 - 31)
 │ │ │ │ ┌───────────── month (1 - 12) (or JAN-DEC)
 │ │ │ │ │ ┌───────────── day of the week (0 - 7)
 │ │ │ │ │ │          (0 or 7 is Sunday, or MON-SUN)
 │ │ │ │ │ │
 * * * * * *

출처 : Task Execution and Scheduling

옵션 설명
0-59
0-59
시간 0–23
1–31
1–12 (1:1월 - 12: 12월)
요일 0–7 (0:월요일 - 7:일요일)

Jenkins

팀원분이 확인해달라던 Job 설정화면입니다.
* 가 5개이 있군요.
Jenkins Schedule

그럼 Jenkins Schedule 설정을 알아보겠습니다.

분  시간  일  월  요일 
옵션 설명
시간 내의 분(0–59)
시간 시간(0–23)
날짜(1–31)
요일(주) 7이 일요일인 요일(0–7)
  • * 모든 유효한 값을 지정합니다.
  • M-N 값의 범위를 지정합니다.
  • M-N/X 또는 */X 지정된 범위 또는 전체 유효 범위를 통해 X의 간격으로 단계
  • A,B,…,Z 여러 값을 열거합니다.

젠킨스 설정 화면에 H(해시) 를 사용하지 않는경우 H(해시)사용 권장 문구가 나옵니다.

H(해시)를 적용하니 문구가 사라지는군요.
젠킨스 설정 화면에 H(해시) 를 사용하지 않는경우 H(해시)사용 권장 문구가 나옵니다.

Jenkins에서 제공하는 Schedule 설명을 가져왔습니다.

예약된 작업이 시스템에 균일한 부하를 생성하도록 허용하려면 기호 H(해시)를 가능한 모든 곳에서 사용해야 합니다.
예를 들어, 0 0 * * * 매일 12개의 Job을 설정해두면 자정에 시스템이 큰 부하가 발생합니다.
H H * * * 로 설정하면 ​​각 작업을 하루에 한 번 실행하지만 모든 작업을 동시에 실행하지 않아 제한된 리소스에서 운영할 때 좋습니다.

기호 H는 범위와 함께 사용할 수 있습니다.
예를 들어 H H(0-7) * * * 오전 12시(자정)에서 오전 7시 59분 사이의 시간을 의미합니다.

기호 H는 범위에 걸친 임의의 값으로 생각할 수 있지만 실제로는 임의의 함수가 아니라 작업 이름의 해시이므로 주어진 프로젝트에서 값이 안정적으로 유지됩니다.

날짜 필드의 경우 또는 같은 짧은 주기는 */3월 H/3길이가 다양하기 때문에 대부분의 달이 거의 끝날 무렵 일관되게 작동하지 않습니다.
예를 들어, */3 긴 달의 1일, 4일, …31일에 실행되고 다음 달의 다음 날에 다시 실행됩니다.
해시는 항상 1-28 범위에서 선택되므로 H/3월말에 3일에서 6일 사이의 실행 간격이 생성됩니다.
(주기가 길수록 길이도 일정하지 않지만 그 효과는 상대적으로 덜 눈에 띕니다.)

비어있는 라인과 #으로 시작하는 주석 라인은 무시됩니다.

추가적으로, @yearly, @annually, @monthly, @weekly, @daily, @midnight, @hourly 와 같은 별칭을 지원합니다.
해시 시스템을 사용하여 자동 밸런싱을 합니다.
예를 들어, @hourly 는 H * * * *과 동일하며 시간 중 Job을 실행합니다.
@midnight는 오전 12시에서 오전 2시 59분 사이의 시간을 의미합니다.

다양한 설정을 볼까요?

# Every fifteen minutes (perhaps at :07, :22, :37, :52):
H/15 * * * *
# Every ten minutes in the first half of every hour (three times, perhaps at :04, :14, :24):
H(0-29)/10 * * * *
# Once every two hours at 45 minutes past the hour starting at 9:45 AM and finishing at 3:45 PM every weekday:
45 9-16/2 * * 1-5
# Once in every two hour slot between 8 AM and 4 PM every weekday (perhaps at 9:38 AM, 11:38 AM, 1:38 PM, 3:38 PM):
H H(8-15)/2 * * 1-5
# Once a day on the 1st and 15th of every month except December:
H H 1,15 1-11 *
# 8 AM the 1st of every month:
H 8 1 * *

Time zone specification

Jenkins 는 TimeZone을 설정할 수 있습니다.
작업은 Jenkins 구동시 설정된 JVM(Asia/Seoul)의 시간대에서 예약된 시간에 정상적으로 실행됩니다.
이 동작은 필드의 첫 번째 줄에 대체 시간대를 지정하여 선택적으로 변경할 수 있습니다.
시간대 지정은 로 시작하고 TZ=뒤에 시간대 ID가 옵니다.

TZ=Europe/London
# This job needs to be run in the morning, London time
H 8 * * *
# Butlers do not have a five o'clock, so we run the job again
H(0-30) 17 * * *

Apache CentOS

Blog Logo

Weeping Willow


Published

Image

Willow's Blog

Welcome!

Back to Overview