윈도용 프로세스 죽었을 때 다시 살리는 재구동 배치 파일

페이스북에서 잠깐 언급했는데, 윈도 서버에서 구동되는 외부 제작 프로그램이 원인 불명으로 자꾸 죽는 증상이 발생해서 만들어 본 배치 파일입니다. 해당 배치 파일을 스케줄러에 넣어서 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 명령으로 했으며, 그냥 절대경로를 포함한 프로그램 명을 써 주면 배치 파일이 종료되지 않는 증상이 발생합니다.

스케줄러 등록 방법은 아래와 같습니다.

  1. [제어판-예약된 작업]에서 ‘예약된 작업 추가’ 더블클릭. 작업 예약 마법사 실행(윈도 2003 서버 기준)
  2. 해당 배치 파일을 등록. 마법사가 실행되는 동안에는 분 단위 실행 옵션은 보이지 않으므로, 일 단위로 실행되게 우선 설정
  3. 마지막에 ‘[마침]을 클릭하면 이 작업의 고급 속성 열기’를 클릭하고 마침
  4. 일정 탭에서 ‘고급’ 버튼 클릭
  5. ‘작업 반복’에 체크한 후, ‘매’ 항목을 1분으로, ‘언제까지’ 항목에서 ‘기간’을 선택하고 23시간 59분으로 설정 (즉, 이 스케줄은 매일 한 번 실행되며 23시간 59분동안 1분 간격으로 반복 실행된다는 의미임)

결과적으로 제 골치를 썩였던 프로그램은 수정이 완료되어서 이 배치 파일을 쓸 일은 없어졌지만, 기록 차원에서 남겨 둡니다.

덧. 생활코딩 페이스북 그룹에 전에 관련 내용을 올렸더니 Egoing님께서 ‘원인을 모르면 결과를 조지는 수밖에…’라는 명언을 남기셨더랬죠. ㅠㅠ

본문과 상관이 있을 수도 없을 수도 있는 만화

  • 기가 도쿄 토이박스 / 글,그림 : 우메 / 서울문화사 / 발간 중
    하나의 게임을 만들기 위해 봄부터 개발자는 그렇게 울었나…

 

제 글이 유용하셨다면 아래 손가락 모양을 꾸욱~ 눌러주세요.

뗏목지기: 만화를 좋아하고 세상 돌아가는 일에 관심이 많은 평범한 직장인입니다.

View Comments (2)

  • 안녕하세요 뗏목님
    포스팅만 보다가 모르는 부분이 있어 의견 물어 보고자 합니다..
    위에 배치파일을 똑같이 적용해서 네임, DIR부분만 수정해서 실행해 보니
    실행은 되는데.. 프로세스가 열려 있을 때 도 계속 실행 하는거 같아서요
    프로세스가 열려 있을 때 는 실행 안하고 바로 배치파일을 종료 시키고싶은데. 어떻게 해야하나요?

    그리고 혹시 배치파일 조건을 if (프로세스 응답안함) 일 때의 조건을 주고 싶은데 찾아봐도 그런자료는 좀 없네요 ..ㅎㅎ
    제가 배치파일 만들고자 하는게 프로세스가 죽거나, 응답없음 상태일 경우에 배치파일로 프로세스 재실행을 하고, 정상 동작 경우엔 배치파일을 실행하지 않고 바로 빠져나오는건데

    혹시 아시면 답변좀 부탁드립니다 ㅎㅎ..

    • 작성한지 너무 오래된 글이라 저도 가물가물하네요. ^^;; 체크 대상 프로세스가 실행중이면 "~is Running" 출력하고 종료되야 하는데요. 그게 아니라 "~is not Running" 출력하고 대상 프로세스 실행으로 넘어간다는 얘기인가요? 그렇다면 tasklist 명령 부분을 cmd에서 직접 실행해서 정상적으로 프로세스 체크를 하는지 확인해보실 필요가 있을 것 같습니다. 제가 지금 이동중이라 당장은 바로 확인이 어렵겠어요. ㅠㅠ

      그리고 응답안함이라는 건, 프로세스는 실행중인데 정상 동작을 하지 않는 상태를 말씀하시나요? 그 부분을 체크하는 건 당장 떠오르진 않네요. 프로세스의 동작 방식에 따라 다른 접근이 필요하지 않을까 싶긴 합니다.

      피씨 앞에 앉을 수 있는 상황이 되면 한 번 살펴보도록 할게요. ^^