메뉴 닫기

리눅스 cron 월, 요일 조건 동시 설정

리눅스에서 예정된 반복 작업을 실행해야 할때 cron 설정으로 일반적으로 사용합니다.

예를들어 하루에 작업한 데이터를 특정 시간에 백업을 원한다고 하면 cron 설정으로 간단하게 할수 있습니다.

보통 redhat, debian 계열의 OS에서는 /etc/crontab에 정의를 하거나 crontab 명령어를 통해 쉽게 구현 할수 있습니다.

cron 설정은 분, 시, 일, 월, 주 단위로 설정을 합니다.

근데 한달에 한번 특정 일과 특정 요일을 선택하여 설정하는것은 되지 않습니다.
이럴 경우엔 crontab에 조건을 넣어야 가능합니다.

쉽게 설명을 하면 매월 첫째주 월요일 업무 시작 시간안에 반복 작업이 실행해야 할 경우 날짜를 입력하는 부분에서  문제가 발생합니다.
2022년 1월 첫째주 월요일이 3일인데  어떤 월은 1일, 어떤 월은 2일 이렇게 다르기 때문입니다.

매월 첫째주 월요일 8시 부터 16시 안에 특정 작업이 랜덤으로 시간을 설정하여 동작 하게 테스트 해보겠습니다.

 


 

jyh@jyh-test:~$ sudo cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don’t have to run the `crontab’
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .—————- minute (0 – 59)
# | .————- hour (0 – 23)
# | | .———- day of month (1 – 31)
# | | | .——- month (1 – 12) OR jan,feb,mar,apr …
# | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts –report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.monthly )

# 매월 첫째주 월요일에 8~16시 사이 랜덤 시간에 파일 복사
00 08 1-7 * * jyh if [ $(date +\%u) -eq 1 ]; then perl -le ‘sleep rand 28800’ ; cp /home/jyh/temp.txt /home/jyh/temp_$(date +\%Y\%m\%d-\%H-\%M-\%S).txt;fi

jyh@jyh-test:~$ ls
temp.txt temp_20220103-10-33-52.txt

 

  • 00 08 1-7 * * 
                             첫번째 00 – 0분
                             두번 째 08 – 8시
                             세번째 1-7 – 1일~7일 
                             네번째  * –  매월

                             마지막 *  – 매주

  • jyh  if [ $(date +\%u) -eq 1 ]; then perl -le ‘sleep rand 28800’ ; cp /home/jyh/temp.txt /home/jyh/temp_$(date +\%Y\%m\%d-\%H-\%M-\%S).txt;fi 
                             jyh 계정으로 1~7일이 월요일일 경우에 288000초 안에 랜덤 시간으로 실행.
                            $(date +\%u)  출력되는 값은  실행하는 날의 요일을 의미 하며  월요일은 1입니다.

 

 

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x