매장 PC나 서버에서 꼭 떠 있어야 하는 프로그램이 가끔 저절로 꺼질 때가 있습니다. 매번 사람이 확인해서 다시 켤 수는 없으니, 작업 스케줄러에 배치 파일을 걸어 두고 몇 분마다 "실행 중인지 확인하고, 아니면 다시 실행"하게 만드는 방법을 많이 씁니다. 예제는 메모장(notepad.exe)으로 되어 있으니 감시할 프로그램 이름과 경로만 바꾸면 됩니다.
@ECHO OFF
CD C:\tmp
TASKLIST | FIND "notepad.exe" > NUL
IF NOT ERRORLEVEL 1 (
ECHO 기동중입니다.
GOTO PGOK
) ELSE (
ECHO 기동되어있지 않습니다.
GOTO PGNG
)
:PGOK
ECHO 기동되어있으므로 그냥종료
GOTO END
:PGNG
ECHO 기동안되어있으므로 기동합니다. %DATE% %TIME% >> process_test.txt
START %SystemRoot%\system32\notepad.exe
GOTO END
:END
ECHO
EXIT
동작 방식
TASKLIST는 현재 실행 중인 프로세스 목록을 출력하고, 그 결과를 FIND로 넘겨 notepad.exe라는 글자가 있는지 찾습니다. > NUL은 찾은 줄을 화면에 찍지 않게 버리는 것이고, 필요한 건 FIND의 종료 코드(ERRORLEVEL)뿐입니다. 찾으면 0, 못 찾으면 1이 됩니다.
여기서 헷갈리기 쉬운 게 IF ERRORLEVEL 1의 의미입니다. 이건 "ERRORLEVEL이 1과 같으면"이 아니라 "1 이상이면"이라는 뜻이라, IF NOT ERRORLEVEL 1은 "1보다 작으면", 즉 0일 때(찾았을 때)가 됩니다. 그래서 첫 번째 괄호가 "실행 중" 쪽입니다.
실행 중이 아니면 PGNG로 가서 현재 날짜·시각을 process_test.txt에 한 줄 덧붙이고(>>는 이어 쓰기), START로 프로그램을 띄웁니다. START를 쓰는 이유는 배치 파일이 프로그램 종료를 기다리지 않고 바로 다음 줄로 넘어가게 하기 위해서입니다. 그냥 경로만 쓰면 프로그램을 닫을 때까지 배치 창이 남아 있습니다. 로그 파일은 맨 위 CD C:\tmp로 옮겨 간 폴더에 생기니, 그 폴더가 없으면 미리 만들어 두거나 다른 경로로 바꿔야 합니다.
마지막의 ECHO는 내용 없이 쓰면 빈 줄이 아니라 "ECHO가 해제되어 있습니다." 같은 상태 메시지를 출력합니다. 빈 줄을 원했다면 ECHO.로 쓰면 됩니다.
실제로 걸어 둘 때
FIND "notepad.exe"는 부분 문자열 검색이라, 이름이 비슷한 다른 프로세스(mynotepad.exe 등)가 있으면 실행 중으로 잘못 판단할 수 있습니다. 정확히 하려면 TASKLIST /FI "IMAGENAME eq notepad.exe"로 걸러서 확인하는 쪽이 안전합니다. 또 FIND는 기본이 대소문자 구분이라 /I 옵션을 붙여 두면 프로세스 이름 대소문자 차이로 놓치는 일이 없습니다.
작업 스케줄러에 등록할 때는 "사용자가 로그온할 때만 실행"으로 해야 프로그램 창이 화면에 뜹니다. "로그온 여부에 관계없이 실행"으로 두면 프로그램이 보이지 않는 세션에서 실행되어, 떠 있긴 한데 화면에서는 찾을 수 없는 상태가 됩니다. 반복 간격은 프로그램이 꺼졌을 때 얼마나 빨리 복구돼야 하는지에 맞춰 5분이나 10분 정도로 잡는 경우가 많습니다.