[MIP-31] Batch파일 실행시 리턴값이 0이 아닐때 다음 수행되어야 할 리소스가 수행 되지 못하는 현상
Subject
Batch파일 실행시 리턴값이 0이 아닐때 다음 수행되어야 할 리소스가 수행 되지 못하는 현상
APPLIES TO:
MCCS 3.1
SYMPTOMS
BatchbeforeOnline 등에 batch파일을 등록하여 프로세스들(인천공항case; java.exe)을 삭제시킨 후 리소스를 시작시키고자 할 때, java.exe파일이 없는데 taskkill명령이 수행되면 리턴값이 0가 아니게 되는데, 이때 MCCS log 창에서 패치파일 실패로 뜨면서 다음 리소스시작 수행이 안되었습니다.
CAUSE
그룹이 온라인되는 순서 상에서 해당 리소스를 시작하는 명령이 실패할 경우 해당 노드에서의 그룹 온라인이 실패한 것으로 간주하고 다음 단계의 리소스 온라인을 진행하지 않습니다.
이유는 명확한 정의를 위한 것입니다.
아래와 같은 명령의 경우는 taskkill 명령의 결과에 따라 java 실행이 영향을 받을 수 있습니다. 이 배치를 실행하는 cmd 프로세스가 taskill 명령 처리에서 오류를 발견하고 이후 실행을 중지할 수 있기 때문입니다.
taskkill /f /im java.exe
start java -class~~~
exit 0
이를 방지하기 위한 방법에는 두 가지가 있습니다.
첫째, taskkill 명령이 현재 배치를 실행하는 cmd에 영향을 주지 않도록 하는 것입니다.
if 구문을 사용하는 것도 한 방법일 수 있습니다. 그러나 tasklist 명령에서는 프로세스가 검색된 후 taskkill 명령이 실행되기 전에 java.exe가 종료된다면 동일한 문제가 발생합니다.(물론 가능성은 아주 희박합니다.)
tasklist|findstr ""java.exe"" 1>NUL 2>&1
if %errorlevel%==0 (
taskkill /f /im java.exe
)
start java -class~~~
exit 0
아래와 같이 taskill 명령을 적절히 사용하는 방법도 있습니다.
taskkill /F /FI ""IMAGENAME eq java.exe""
start java -class~~~
exit 0
다음은 cmd가 세부 실행 명령에 영양을 받지 않게하는 두번째 방법입니다.
위의 두 방법은 사용하는 명령(taskkill)의 정상 실행을 신뢰할 수 있다는 전제가 있습니다. 정해진 인자와 상황이 맞을 경우 항상 정확히 동작한다는 전제입니다.
그러나 만일 전적으로 신뢰할 수 없을 경우는 cmd가 새로운 프로세스를 fork 하여 해당 명령을 실행하도록 할 수 있습니다.
start taskkill /F /IM java.exe
start java -class~~~
exit 0
SOLUTION
위의 예는 모두 무조건 정상값(0)을 반환하겠다는 명확한 표현입니다.
그러나 ""무조건 0을 반환한다""는 사실에 대해서는 생각해 볼 여지가 많습니다.