だいぶ前に作ったTeraTermマクロのUNIXサーバ運用作業自動化ツールでエラーが出たというので見に行くと、Stack overflowというマクロのエラーダイアログが。
要件的には、psコマンドで特定のJVMプロセス終了を持って次に進む、20回チェックして終わってないならダイアログを表示し、その前の処理に戻るという内容ですが、たまたま今回の作業中に長時間動作するプロセスが実行中となっており、psを11回実行したところで停止した状態になってました。
これまで何回も使われているマクロの自動化ツールですが、この事象は今回初めて。
ちょっとググるとすぐに下記が出たのでマクロスクリプトを見直したら、ループ中にgotoで飛ぶというダメな作りを痛感。。
https://osdn.jp/ticket/browse.php?group_id=1412&tid=8024
goto否定主義者では無いし、多重ループだと解りにくくなるので、素直にループの外にgotoを出して対応。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
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行目以降を下記に変更
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 |