실행할 자바 프로그램
실행할 프로그램은 1분마다 현재 시각을 알려주는 프로그램이다.
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class PrintTime {
public static void main(String[] args) throws InterruptedException {
LocalDateTime today = LocalDateTime.now();
String formatedNow = today.format(DateTimeFormatter.ofPattern("현재 시각: HH시 mm분 ss초"));
System.out.println(formatedNow);
}
}
코드가 준비 되었다면 cmd 창을 켜고 해당 소스 파일이 있는 디렉토리로 이동한다.
> cd [파일 경로]
반드시 dir 명령어를 쳤을 때 소스 파일(혹은 소스 파일의 패키지 디렉토리)이 존재해야 컴파일 할 수 있다.
코드 내에 한글, 특수문자 등을 사용하여 utf-8 인코딩이 필요한 경우에는 컴파일 옵션으로 따로 설정해야 한다.
> javac -encoding utf-8 PrintTime.java
https://pjw48.net/wordpress/2017/02/15/java-compile-with-utf8/
만약 여기서 기본 클래스를 찾거나 로드할 수 없다는 에러가 뜬다면?
일단 첫번째로 확인할 것은 시스템 환경변수이다.
그래도 안된다면 자바 패키지 문제일 수도 있으니 소스 코드를 확인해봐야한다.
만약 자바 소스 코드를 이클립스와 같은 툴을 통해 프로젝트를 생성하여 작성했다면 맨 윗줄에 package 라인이 있을 것이다.
소스 코드 하나만 돌릴거라면 package 라인을 아예 삭제하고 돌려도 되고, 아니면 패키지 디렉토리의 상위 디렉토리로 이동하여 java personal.PrintTime 이렇게 실행해주면 된다.
cron 사용법
nncron LITE 설치
cron 실행, 중단 방법
일단 관리자 권한으로 cmd 창을 연다.
실행: cron이 설치된 파일 위치에서 startcron.bat를 실행
중단: cron이 설치된 파일 위치에서 stopcron.bat를 실행
cron.bat 작성
워드패드를 관리자 권한으로 실행해서 해당 파일을 연다.
cron.bat 파일에는 실행할 명령어와 스케줄링 시간 정보를 cron format으로 적어야 한다.
@<time_in_cron_format> <command>
기존 cron 포맷은 다음처럼 공백으로 구분된 다섯가지 필드로 구성된다.
<Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week>
하지만 nnCron LITE는 cron 형식의 기존 버전과 향상된 버전을 모두 사용할 수 있다.
<Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week> <Year>
- *: 필드가 가질 수 있는 값의 전체 범위 (만약 minute 자리에 *가 온다면 매 분, hour는 매 시 …)
- ?: nnCron LITE가 실행되었을 때의 시간을 나타냄 (만약 day 자리에 ?가 온다면 nnCron을 실행했을 당시의 날로 값이 지정됨)
- /: 값이 특정 간격으로 반복되도록 지정 (만약 hour 자리에 /5가 온다면 다섯 시간마다 nnCron이 실행됨)
위와 같이 포맷을 작성한 후 실행하고자 하는 명령어를 입력하면 정해진 시간에 프로그램을 실행할 수 있다.
30 9 * * * %COMSPEC% /c d:\tools\my_bat.bat
0 12 * * 1-5 d:\tools\maintain.bat %DD%-%MMM%-%YYYY%.log
이제 PrintTime 파일을 돌려보자!
첫째로, PrintTime 프로그램은 매분 실행이 되어야 하므로 cron format은 * * * * * 가 된다. (* * * * *: 매년 매달 매일 매시 매분)
둘째로, cron에서 java 파일을 돌리기 위해서는
- PrintTime.java 파일이 있는 곳으로 이동
- 컴파일된 PrintTime.class 파일 실행
두가지의 명령어가 동시에 실행되어야 한다. 이때는 && 를 활용한다.
* * * * * cd [class 파일 경로] && java PrintTime
저렇게 하면 정상적으로 실행이 된다!
근데 나는 콘솔창이 너무 빨리 켰다 꺼져서, 확인용으로 자바 파일에 TimeUnit.SECONDS.sleep(5); 붙여줬었다.
아니면 cron.bat 명령어 뒤에 && cmd/k를 붙여주면 cmd 창이 자동으로 꺼지지 않아 결과를 확인할 수 있다. (*cmd/k : 도스 명령창 자동 종료 방지 명령어) 왜 난 안될까 (https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dhcho347&logNo=220038703429)
만약 프로그램의 결과를 한 곳에 모아보고 싶다면 따로 로그 파일을 만들어 거기로 저장해준다.
* * * * * cd [class 파일 경로] && java PrintTime > [class 파일 경로]\log.txt
cron 표현식
필드명 | 값의 허용 범위 | 와일드카드 |
초 (Seconds) | 0 ~ 59 | , - * / |
분 (Minutes) | 0 ~ 59 | , - * / |
시 (Hour) | 0 ~ 23 | , - * / |
일 (Day) | 1 ~ 31 | , - * ? / L W |
월 (Month) | 1 ~ 12 or JAN ~ DEC | , - * / |
요일 (Week) | 0 ~ 6 or SUN ~ SAT | , - * ? / L # |
연도 (Year) | 1970 ~ 2199 or 공백 | , - * / |
Cron 특수문자 (와일드카드)
기호 | 의미 | 예제 |
* | 모든 값 | * * * * * -> 매년 매월 매일 매시 매분 실행 |
? | 특정한 값이 없음 | 일과 요일 필드 중 하나만 지정할 때 지정하지 않는 필드에 ?를 사용한다 |
- | 범위 지정 | 주중에만 실행 -> MON-FRI or 2-6 |
, | 특정한 값 여러개 지정 | 월, 수, 목에만 지정 -> mon, wed, thu |
/ | 시작시간 / 인터벌 단위 | 매 시 정각부터 10분마다 실행 -> 0/10 |
L | 해당 필드의 마지막 값 | 일에서 사용하면 마지막 일 (31, 30..) 요일에서는 마지막 요일 (토) |
W | 가장 가까운 평일 | 해당 월의 15일에서 가장 가까운 평일(월~금) -> 15W |
# | 몇째 주의 무슨 요일을 표현 | 매월 3번째 금요일 -> FRI#3 or 6#3 |