페이스북에서 잠깐 언급했는데, 윈도 서버에서 구동되는 외부 제작 프로그램이 원인 불명으로 자꾸 죽는 증상이 발생해서 만들어 본 배치 파일입니다. 해당 배치 파일을 스케줄러에 넣어서 1분마다 한 번씩 실행하여 프로세스가 죽어 있는 경우 재실행하게 했죠.
배치 파일 내용은 아래와 같습니다.
@echo off
set PNAME=faIpScanner.exe
set DIR=C:\
tasklist /fi "imagename eq %PNAME%" | findstr %PNAME% > null
if %ERRORLEVEL% == 0 (
echo %PNAME% is Running
) else (
echo %PNAME% is not Running. Now Run…
start /d"%DIR%" %PNAME%
)
위에서 faIpScanner.exe는 실제로 자꾸 죽는 그 프로그램은 아니고 테스트하기 위해서 넣어 본 것입니다. PNAME과 DIR 변수에 프로세스 이름과 프로세스가 위치한 디렉토리 명을 넣어주면 됩니다.
tasklist 명령에서 /fi 옵션을 사용해서 해당 프로세스가 작업 목록에 존재하는지 확인합니다. 그런데 tasklist 명령은 해당 프로세스가 없을 때도 종료 코드를 0으로 반환하더군요. 그래서 파이프로 findstr 명령을 줬습니다. 이 명령은 문자열을 확인하는 명령으로 오류 발생 시 0이 아닌 에러코드를 반환합니다.
직전에 실행한 프로그램의 에러 코드는 시스템 변수 %ERRORLEVEL%에 저장되므로 해당 에러코드를 확인해서 프로세스를 실행하게 하였습니다. 프로세스의 실행은 start 명령으로 했으며, 그냥 절대경로를 포함한 프로그램 명을 써 주면 배치 파일이 종료되지 않는 증상이 발생합니다.
스케줄러 등록 방법은 아래와 같습니다.
- [제어판-예약된 작업]에서 ‘예약된 작업 추가’ 더블클릭. 작업 예약 마법사 실행(윈도 2003 서버 기준)
- 해당 배치 파일을 등록. 마법사가 실행되는 동안에는 분 단위 실행 옵션은 보이지 않으므로, 일 단위로 실행되게 우선 설정
- 마지막에 ‘[마침]을 클릭하면 이 작업의 고급 속성 열기’를 클릭하고 마침
- 일정 탭에서 ‘고급’ 버튼 클릭
- ‘작업 반복’에 체크한 후, ‘매’ 항목을 1분으로, ‘언제까지’ 항목에서 ‘기간’을 선택하고 23시간 59분으로 설정 (즉, 이 스케줄은 매일 한 번 실행되며 23시간 59분동안 1분 간격으로 반복 실행된다는 의미임)
결과적으로 제 골치를 썩였던 프로그램은 수정이 완료되어서 이 배치 파일을 쓸 일은 없어졌지만, 기록 차원에서 남겨 둡니다.
덧. 생활코딩 페이스북 그룹에 전에 관련 내용을 올렸더니 Egoing님께서 ‘원인을 모르면 결과를 조지는 수밖에…’라는 명언을 남기셨더랬죠. ㅠㅠ
- 기가 도쿄 토이박스 / 글,그림 : 우메 / 서울문화사 / 발간 중
하나의 게임을 만들기 위해 봄부터 개발자는 그렇게 울었나…
제 글이 유용하셨다면 아래 손가락 모양을 꾸욱~ 눌러주세요.
View Comments (2)
안녕하세요 뗏목님
포스팅만 보다가 모르는 부분이 있어 의견 물어 보고자 합니다..
위에 배치파일을 똑같이 적용해서 네임, DIR부분만 수정해서 실행해 보니
실행은 되는데.. 프로세스가 열려 있을 때 도 계속 실행 하는거 같아서요
프로세스가 열려 있을 때 는 실행 안하고 바로 배치파일을 종료 시키고싶은데. 어떻게 해야하나요?
그리고 혹시 배치파일 조건을 if (프로세스 응답안함) 일 때의 조건을 주고 싶은데 찾아봐도 그런자료는 좀 없네요 ..ㅎㅎ
제가 배치파일 만들고자 하는게 프로세스가 죽거나, 응답없음 상태일 경우에 배치파일로 프로세스 재실행을 하고, 정상 동작 경우엔 배치파일을 실행하지 않고 바로 빠져나오는건데
혹시 아시면 답변좀 부탁드립니다 ㅎㅎ..
작성한지 너무 오래된 글이라 저도 가물가물하네요. ^^;; 체크 대상 프로세스가 실행중이면 "~is Running" 출력하고 종료되야 하는데요. 그게 아니라 "~is not Running" 출력하고 대상 프로세스 실행으로 넘어간다는 얘기인가요? 그렇다면 tasklist 명령 부분을 cmd에서 직접 실행해서 정상적으로 프로세스 체크를 하는지 확인해보실 필요가 있을 것 같습니다. 제가 지금 이동중이라 당장은 바로 확인이 어렵겠어요. ㅠㅠ
그리고 응답안함이라는 건, 프로세스는 실행중인데 정상 동작을 하지 않는 상태를 말씀하시나요? 그 부분을 체크하는 건 당장 떠오르진 않네요. 프로세스의 동작 방식에 따라 다른 접근이 필요하지 않을까 싶긴 합니다.
피씨 앞에 앉을 수 있는 상황이 되면 한 번 살펴보도록 할게요. ^^