IDL/Programming

작업 스케줄러를 이용한 IDL 프로그램의 자동 실행

이상우_idl 2018. 8. 20. 13:39
728x90
반응형

오늘은 IDL 프로그램을 윈도우즈 OS에서 작업 스케줄러 기능을 사용하여 자동으로 실행하는 방법을 소개해보고자 합니다. 이러한 방식은 하나의 완성된 IDL 프로그램이 일정한 시간 간격과 같은 조건하에 컴퓨터상에서 알아서 자동으로 실행되도록 해야 하는 경우 유용합니다. 예를 들어 일정한 시간 간격을 두고 가장 최근의 데이터를 사용해서 텍스트나 그림과 같은 형태의 결과 파일을 주기적으로 생산해야하는 경우를 생각해볼 수 있습니다. 리눅스나 유닉스 등과 같은 OS에서 크론탭(Crontab) 기능을 사용하여 반복 예약 작업을 하는 경우와 마찬가지라고 보면 됩니다. 이러한 작업을 윈도우즈 OS에서 구현하는 방법을 예제와 함께 살펴보겠습니다.

 

우선 이러한 작업이 가능하려면 한가지 전제조건이 있습니다. 먼저 윈도우즈의 명령 프롬프트(CMD 명령을 실행하면 나오는 모드)상에서 idl 명령의 실행이 가능하도록 환경설정을 해두는 것입니다. 이 방법에 대해서는 제가 예전에 여기 올렸던 관련 게시물에 자세히 소개한 바 있으므로 이 내용을 참조해서 설정해두시면 됩니다. 사실 이러한 설정을 해두는 것은 오늘 소개할 작업 스케줄에서의 실행 뿐 아니라 그냥 일반적인 IDL 사용에 있어서도 유용하기 때문에, 가급적이면 해두시는 것을 권장합니다.

 

그러면 예제용 IDL 프로그램부터 먼저 만들어봅시다. 내용은 다음과 같습니다.

 

PRO test_run_sav

 

dstr = SYSTIME()

x = FINDGEN(101)

y = SQRT(x)

win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR, BUFFER=0)

pl = PLOT(x, y, COLOR='green', THICK=2, FONT_SIZE=11, /CURRENT)

tx = TEXT(5, 9, dstr, COLOR='crimson', FONT_SIZE=14, /DATA)

win.Save, 'figures/test_run_sav.png', WIDTH=600

 

 

END

 

이 프로그램은 SYSTIME 함수를 이용하여 현재의 시간 정보를 문자값으로 가져온 다음, 플롯을 하나 그리고 그 위에 시간 정보를 캡션 문자로 삽입하고, 그 결과 그림을 PNG 형식의 파일로 저장하는 과정을 수행합니다. 그리고 한가지 주목해야 할 부분은 WINDOW 함수에서 BUFFER 키워드의 값을 1로 설정한 것인데, 이렇게 하면 그래픽창이 화면에 뜨지 않고 메모리상에서만 조용히 작업이 수행됩니다. 자동적으로 실행되어야 하는 작업이기 때문에 이렇게 해두는 것이 반드시 필요합니다. 그 다음에는 이 프로그램을 test_run_sav.pro라는 IDL 소스코드 파일로 저장해야 합니다. 이 프로그램을 실행했을 때 생성되는 PNG 파일을 보면 다음과 같은 모습의 그림이 저장된 것을 확인할 수 있습니다. 캡션문자로 삽입된 시간 정보는 당연히 실행을 할 때마다 달라지게 됩니다. 따라서 언제 저장된 그림인가를 그림만 봐도 쉽게 알 수 있기 때문에, 예제 프로그램을 이렇게 만들어봤습니다.

 

 

 

이제 다음 단계는 이 IDL 프로그램을 외부용 실행파일인 .sav 파일로 만드는 것입니다. "외부용 실행"의 의미는 이 프로그램을 IDL 내에서 실행하는 것이 아니라 IDL 바깥에서 실행 가능하도록 해주는 실행파일을 만든다는 의미입니다. 마치 윈도우즈 OS에서 많이 사용되는execution 파일(~.exe 파일)을 만드는 것과 비슷한 개념이라고 봐도 됩니다. 이를 위해서는 IDL의 콘솔창(명령입력창)에서 다음과 같이 .compile, resolve_all, save 명령들을 순차적으로 실행하면 됩니다.

 

IDL> .compile test_run_sav

% Compiled module: TEST_RUN_SAV.

 

IDL> resolve_all

IDL> save, /routines, filename='test_run_sav.sav'

 

이와 같이 IDL 프로그램에 대한 외부용 실행파일을 생성하는 방법에 관해서는 제가 예전에 올렸던 관련 게시물도 있으므로 이 내용을 함께 참조하시는 것도 좋습니다. 어쨌든 이러한 과정들이 성공적으로 진행되면, IDL 상에서 '현재 디렉토리'로 설정되어 있는 디렉토리 안에 test_run_sav.sav라는 실행파일이 생성됩니다. 그러면 이제는 IDL을 종료한 후 윈도우즈에서 CMD를 실행하여 명령 프롬프트를 띄웁시다. 그리고 여기서 CD 명령을 사용하여 test_run_sav.sav 파일이 있는 디렉토리로 이동합니다. 그 다음에 idlrt라는 실행명령을 사용하여 sav 파일을 실행하면 됩니다. 물론 이렇게 해도 아까 IDL에서 test_run_sav.pro 코드를 실행했을 때와 동일한 결과를 얻게 됩니다. 명령 프롬프트상에서 이 명령들을 실행한 모습은 다음 스크린샷과 같습니다.

 

 

 

이렇게 실행을 한 후 저장된 그림을 확인해보면 날짜 및 시각 정보가 실행 시각에 맞춰 변경된 것을 볼 수 있습니다. 프로그램이 제대로 실행되었단 얘기입니다. 이와 같이 IDL 프로그램을 외부용 실행파일로 만들어두고 명령 프롬프트에서 정상적으로 실행 가능하도록 해두면 이제 작업 스케줄러에 설정을 해볼 수 있습니다. 사실 작업 스케줄러에서 예약 작업을 설정하는 방법이 아마 여러가지가 있을 것 같은데, 여기서는 제가 테스트해본 방식을 기준으로 소개하겠습니다. 윈도우즈에서 '작업 스케줄러'를 실행하면 뜨는 인터페이스에서 우측 탭에 '작업'이라는 카테고리 내에 여러가지 버튼들이 있는데, 그 중에서 '작업 만들기'라는 버튼을 누르면 다음 그림과 같은 모습의 '새 작업 만들기'라는 타이틀의 인터페이스 창이 떠서 여기서 새로운 예약 작업을 생성할 수 있습니다.

 

 

 

여기서 '동작' 탭으로 가서 '새로 만들기' 버튼을 누르면 '새 동작 만들기'라는 타이틀의 인터페이스 창이 또 뜹니다. 여기서 다음과 같이 내용들을 입력하고 확인 버튼을 누릅니다.

 

 

 

여기서 '시작 위치' 항목에는 .sav 파일이 저장된 디렉토리를 여러분의 윈도우즈 PC 환경에 맞게 입력하면 됩니다. 그 다음에는 다시 '새 작업 만들기' 창에서 '트리거' 탭으로 이동하여 프로그램이 실행될 시각과 관련된 설정을 해줘야 합니다. 여기서는 단발성 실행, 주기적 실행 등등 여러가지 방식으로 작업 시간에 대한 예약이 가능한데, 여러분이 직접 해보시길 바랍니다. 이 설정과 관련해서는 여기서는 더 자세히 다루진 않겠습니다. 그리고 '새 작업 만들기' 창에서 '일반' 탭을 보면 '보안 옵션'에 '사용자가 로그온 할 때에만' 실행할 것인지 아니면 '로그온 여부와 관계없이' 실행할 것인지에 대해서도 설정이 가능합니다. 후자로 설정할 경우에는 사용자가 로그온이 안되어있어도 컴퓨터가 켜져있기만 하면 알아서 실행되도록 할 수 있습니다. 다만 이렇게 하려면 아마 컴퓨터의 관리자 계정으로 설정을 해야 가능하다고 봐야 하므로 이 점만 유의하시면 됩니다.

 

그래서 이런 방식으로 작업 스케줄러의 모든 설정들을 마친 후 확인 버튼을 누르면 이 작업이 예약됩니다. 실제로 이 작업이 예약된 스케줄에 맞춰 제대로 실행되는지를 확인하려면 디렉토리로 가서 생성된 그림의 캡션문자의 내용을 확인해보면 됩니다. 저는 IDL 8.7에서 생성한 .sav 실행파일을 윈도우즈 10의 작업 스케줄러에서 실행 예약을 해서 테스트를 해봤는데, 잘 진행되는 것을 확인하였습니다. 그리고 사용자의 로그온 여부와 관계없이 실행되도록 하는 것도 관리자 계정에서 예약 설정을 했더니 잘 됩니다. 여러분들도 나름대로 설정을 해서 테스트해보시면 될 것 같습니다.

 

그래서 이러한 방식으로 IDL 프로그램을 작업 스케줄러에서 예약한 스케줄에 따라 자동으로 실행되도록 할 수도 있다는 것을 염두에 두시면, 여러모로 활용의 폭이 더 넓어질 것 같습니다. 참고로 리눅스나 유닉스의 경우에는 .sav 실행파일을 실행하는 명령을 다음과 같은 형태로 정의하고, 이 내용을 shell script 파일로 저장하여 크론탭에 예약해두는 방식으로 설정하면 됩니다.

 

idl -rt=test_run_sav.sav

 

다만 shell script 작성 방식이나 크론탭 예약 방식 등은 리눅스나 유닉스의 세부 버전에 따라서도 조금씩 다를 수 있으므로, 여기서는 이 정도만 언급해두기로 하겠습니다.

반응형