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

Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /volume1/web/www/blog/wp-content/plugins/wp-syntax/wp-syntax.php on line 380 Call Stack: 0.0001 360448 1. {main}() /volume1/web/www/blog/index.php:0 0.0001 360752 2. require('/volume1/web/www/blog/wp-blog-header.php') /volume1/web/www/blog/index.php:17 0.4555 16735600 3. require_once('/volume1/web/www/blog/wp-includes/template-loader.php') /volume1/web/www/blog/wp-blog-header.php:19 0.4593 16793328 4. include('/volume1/web/www/blog/wp-content/themes/oceanwp/singular.php') /volume1/web/www/blog/wp-includes/template-loader.php:106 0.6618 18249608 5. get_template_part($slug = 'partials/single/layout', $name = 'post', $args = ???) /volume1/web/www/blog/wp-content/themes/oceanwp/singular.php:53 0.6618 18250016 6. locate_template($template_names = [0 => 'partials/single/layout-post.php', 1 => 'partials/single/layout.php'], $load = TRUE, $load_once = FALSE, $args = []) /volume1/web/www/blog/wp-includes/general-template.php:206 0.6619 18250128 7. load_template($_template_file = '/volume1/web/www/blog/wp-content/themes/oceanwp/partials/single/layout.php', $load_once = FALSE, $args = []) /volume1/web/www/blog/wp-includes/template.php:745 0.6619 18250480 8. require('/volume1/web/www/blog/wp-content/themes/oceanwp/partials/single/layout.php') /volume1/web/www/blog/wp-includes/template.php:812 0.6649 18253120 9. get_template_part($slug = 'partials/single/content', $name = ???, $args = ???) /volume1/web/www/blog/wp-content/themes/oceanwp/partials/single/layout.php:54 0.6649 18253472 10. locate_template($template_names = [0 => 'partials/single/content.php'], $load = TRUE, $load_once = FALSE, $args = []) /volume1/web/www/blog/wp-includes/general-template.php:206 0.6649 18253584 11. load_template($_template_file = '/volume1/web/www/blog/wp-content/themes/oceanwp/partials/single/content.php', $load_once = FALSE, $args = []) /volume1/web/www/blog/wp-includes/template.php:745 0.6649 18253888 12. require('/volume1/web/www/blog/wp-content/themes/oceanwp/partials/single/content.php') /volume1/web/www/blog/wp-includes/template.php:812 0.6650 18253888 13. the_content($more_link_text = ???, $strip_teaser = ???) /volume1/web/www/blog/wp-content/themes/oceanwp/partials/single/content.php:19 0.6652 18253920 14. apply_filters($hook_name = 'the_content', $value = '

페이스북에서 잠깐 언급했는데, 윈도 서버에서 구동되는 외부 제작 프로그램이 원인 불명으로 자꾸 죽는 증상이 발생해서 만들어 본 배치 파일입니다. 해당 배치 파일을 스케줄러에 넣어서 1분마다 한 번씩 실행하여 프로세스가 죽어 있는 경우 재실행하게 했죠.

\r\n\r\n

배치 파일 내용은 아래와 같습니다.

\r\n\r\n
@echo off\r\n\r\nset PNAME=faIpScanner.exe\r\nset DIR=C:\\\r\n\r\ntasklist /fi "imagena'...) /volume1/web/www/blog/wp-includes/post-template.php:256
    0.6652   18254168  15. WP_Hook->apply_filters($value = '

페이스북에서 잠깐 언급했는데, 윈도 서버에서 구동되는 외부 제작 프로그램이 원인 불명으로 자꾸 죽는 증상이 발생해서 만들어 본 배치 파일입니다. 해당 배치 파일을 스케줄러에 넣어서 1분마다 한 번씩 실행하여 프로세스가 죽어 있는 경우 재실행하게 했죠.

\r\n\r\n

배치 파일 내용은 아래와 같습니다.

\r\n\r\n
@echo off\r\n\r\nset PNAME=faIpScanner.exe\r\nset DIR=C:\\\r\n\r\ntasklist /fi "imagena'..., $args = [0 => '

페이스북에서 잠깐 언급했는데, 윈도 서버에서 구동되는 외부 제작 프로그램이 원인 불명으로 자꾸 죽는 증상이 발생해서 만들어 본 배치 파일입니다. 해당 배치 파일을 스케줄러에 넣어서 1분마다 한 번씩 실행하여 프로세스가 죽어 있는 경우 재실행하게 했죠.

\r\n\r\n

배치 파일 내용은 아래와 같습니다.

\r\n\r\n
@echo off\r\n\r\nset PNAME=faIpScanner.exe\r\nset DIR=C:\\\r\n\r\ntasklist /fi "imagena'...]) /volume1/web/www/blog/wp-includes/plugin.php:205
    0.6652   18255544  16. WP_Syntax::beforeFilter($content = '

페이스북에서 잠깐 언급했는데, 윈도 서버에서 구동되는 외부 제작 프로그램이 원인 불명으로 자꾸 죽는 증상이 발생해서 만들어 본 배치 파일입니다. 해당 배치 파일을 스케줄러에 넣어서 1분마다 한 번씩 실행하여 프로세스가 죽어 있는 경우 재실행하게 했죠.

\r\n\r\n

배치 파일 내용은 아래와 같습니다.

\r\n\r\n
@echo off\r\n\r\nset PNAME=faIpScanner.exe\r\nset DIR=C:\\\r\n\r\ntasklist /fi "imagena'...) /volume1/web/www/blog/wp-includes/class-wp-hook.php:324
    0.6652   18255544  17. preg_replace_callback($pattern = '/\\s*(.*)<\\/pre>\\s*/siU', $callback = [0 => 'WP_Syntax', 1 => 'substituteToken'], $subject = '

페이스북에서 잠깐 언급했는데, 윈도 서버에서 구동되는 외부 제작 프로그램이 원인 불명으로 자꾸 죽는 증상이 발생해서 만들어 본 배치 파일입니다. 해당 배치 파일을 스케줄러에 넣어서 1분마다 한 번씩 실행하여 프로세스가 죽어 있는 경우 재실행하게 했죠.

\r\n\r\n

배치 파일 내용은 아래와 같습니다.

\r\n\r\n
@echo off\r\n\r\nset PNAME=faIpScanner.exe\r\nset DIR=C:\\\r\n\r\ntasklist /fi "imagena'...) /volume1/web/www/blog/wp-content/plugins/wp-syntax/wp-syntax.php:380

페이스북에서 잠깐 언급했는데, 윈도 서버에서 구동되는 외부 제작 프로그램이 원인 불명으로 자꾸 죽는 증상이 발생해서 만들어 본 배치 파일입니다. 해당 배치 파일을 스케줄러에 넣어서 1분마다 한 번씩 실행하여 프로세스가 죽어 있는 경우 재실행하게 했죠.

배치 파일 내용은 아래와 같습니다.

@echo off
 
set PNAME=faIpScanner.exe
set DIR=C:\
 
tasklist /fi "imagename eq %PNAME%" | findstr %PNAME% &gt; 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님께서 ‘원인을 모르면 결과를 조지는 수밖에…’라는 명언을 남기셨더랬죠. ㅠㅠ

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

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

 

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

뗏목지기

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