だいぶ前に作ったTeraTermマクロのUNIXサーバ運用作業自動化ツールでエラーが出たというので見に行くと、Stack overflowというマクロのエラーダイアログが。
要件的には、psコマンドで特定のJVMプロセス終了を持って次に進む、20回チェックして終わってないならダイアログを表示し、その前の処理に戻るという内容ですが、たまたま今回の作業中に長時間動作するプロセスが実行中となっており、psを11回実行したところで停止した状態になってました。
これまで何回も使われているマクロの自動化ツールですが、この事象は今回初めて。
ちょっとググるとすぐに下記が出たのでマクロスクリプトを見直したら、ループ中にgotoで飛ぶというダメな作りを痛感。。
https://osdn.jp/ticket/browse.php?group_id=1412&tid=8024
goto否定主義者では無いし、多重ループだと解りにくくなるので、素直にループの外にgotoを出して対応。
timeout=3
:BEFORE_PROC
~前処理の詳細は割愛~
ifdefined OUTPUTBUF
if result = 0 then
strdim OUTPUTBUF 500
endif
CHK_COUNT_OVER = 20
CHK_COUNT_NUM = 0
:CHK_PROCESS_ASTART
OUTPUTCNT = 0
flushrecv
setsync 1
CMD = "ps -ef | grep -e JOB0010 -e JOB0020 -e JOB0030 -e JOB0040 -e JOB0050 -e JOB0060 "
strconcat CMD "-e JOB0070 -e JOB0080 | grep -v grep"
sendln CMD
recvln
while result = 1
recvln
if result = 0 then
break
endif
OUTPUTBUF[OUTPUTCNT] = inputstr
OUTPUTCNT = OUTPUTCNT + 1
endwhile
setsync 0
if OUTPUTCNT > 0 then
CHKSTR = '/bin/java'
for ii 0 OUTPUTCNT - 1
strscan OUTPUTBUF[ii] CHKSTR
if result > 0 then
CHK_COUNT_NUM = CHK_COUNT_NUM + 1
if CHK_COUNT_NUM >= CHK_COUNT_OVER then
messagebox 'プロセスが実行中で作業を続行出来ません。'#13'状態を確認してくだい(OKで前処理から続行します)' OUTPUTBUF[ii]
goto BEFORE_PROC
else
pause 3
goto CHK_PROCESS_ASTART
endif
endif
next
endif
上記の33行目以降を下記に変更
CHKSTATUS = 1
if OUTPUTCNT > 0 then
CHKSTR = '/bin/java'
for ii 0 OUTPUTCNT - 1
strscan OUTPUTBUF[ii] CHKSTR
if result > 0 then
CHK_COUNT_NUM = CHK_COUNT_NUM + 1
if CHK_COUNT_NUM >= CHK_COUNT_OVER then
CHKSTATUS = 2
messagebox 'プロセスが実行中で作業を続行出来ません。'#13'状態を確認してくだい(OKで前処理から続行します)' OUTPUTBUF[ii]
else
CHKSTATUS = 3
pause 3
endif
endif
next
endif
if CHKSTATUS = 2 then
goto BEFORE_PROC
elseif CHKSTATUS = 3 then
goto CHK_PROCESS_ASTART
endif