Windows で onbar を使ってみたら...

oninit

2006年08月20日 01:56

Informix Dynamic Server (バージョンは忘れた..)バックアップ・コマンド "onbar" を Windows で使っていて不思議な経験をした、というかハマリました。


(なんか、最近海外からっぽいアクセスが多いようなので英語で要約してみたりして。。)
Summary: On Windows, if you execute "onbar" from inside your batch file, remember that it is running as Windows Batch file. You should probably call onbar using "cmd /c onbar -b..." especially if you use it in a loop. It can avoid command line length overflow..
(日本語で以下だらだら書いてるけど、英語で要約するとたったこれだけかい...)


Unix でも Winodws でも、コマンドラインから "onbar" を実行した時に最初に呼び出されるのは、シェルスクリプト ( Winodws ではバッチファイル ) です。このスクリプトで引数の処理や必要な環境変数の設定などをして、onbar_d ( Windows では onbar_d.exe ) を呼び出しています。


さて、Unix ではシェル・スクリプトは呼び出し元のシェルとは別の、新しく呼び出されたシェルのプロセス上で実行されます。ところが、Windows のバッチファイルは、呼び出し元のシェル ( cmd.exe ) がバッチファイルのコマンドを実行しています。なので、バッチファイルの中で onbar を呼び出す時に、単純に


onbar -b -L 0
( "-L 0" の部分は、あくまでも一例、ということで )

と書くと、呼び出し元のバッチファイルの処理が onbar を呼び出した後で終わってしまいます。ちゃんと、


call onbar -b -L 0

としないと。おっと、これで十分だと思っていたのですが、まず第一の落とし穴。


動作確認のために、SQLを実行し終了後随時データと論理ログをバックアップし、それを何千回か繰り返し、というテストをしていたのですが、なぜかその繰り返しを行うバッチファイルが何回目(数十回だったような)かでそれ以上動かなくなってしまいます。
こんなエラーが表示されます:


=== ここから
入力行が長すぎます。
:cont
の使い方が誤っています。
=== ここまで

一度動かなくなると、そのコマンドウィンドウから手で onbar を実行しても動きません。同じエラーが出て、onbar が動きません。


調べたら、何と onbar の中で追加されていく環境変数の設定が貯まり貯まってコマンド長の制限を超えてしまっていたのが原因でした。環境変数をみると、実はこんなことになっているんですね~。




Path=c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20\bin;c:\ism\2.20....    ( 以下省略。)

onbar.bat は、実行のたびに、ISM 関連のコマンドへのパスを PATH に追加しているんですね。


結局、バッチファイルの中で onbar を呼び出す部分を、




cmd /c onbar -b -L 0


に書き換えたら、ようやく思った通りにテストが動くようになりました。これは Informix の onbar に限った話ではなく、Unix ( Linux を含む) のシェル・スクリプトを Windows で動くように書き換える時には注意しないといけないですね。

ちなみに、Informix Dynamic Server では、ONCONFIG のALARMPROGRAM というパラメーターで、論理ログがいっぱいになった時に自動的に onbar を呼び出して、バックアップを実行することができますが、この時には、onbar の実行のために毎回 cmd.exe が呼び出され、onbar が終了すると cmd.exe も終了する(と思われる)ので、連続実行してもこのような問題はないでしょうね。
2006年9月11日: 足跡チェックをしていたら、"入力行が長すぎます" とか、"コマンドライン BAT 連続実行" などといったキーワードでたどり着いている人が多数いるのを発見しました。みんな同じようなことで嵌っているのですね。この記事は Informix Dynamic Server についてのものなのでちょっとわかりにくいかもしれません。しかし、それ以上に難解なのが "入力行が長すぎます"というメッセージ。言われてみれば確かにそのとおり ( 環境変数 PATH に代入する右辺値が長くなりすぎ、故にset コマンドの実行行が長くなりすぎ、実行できない) なのですが、原因を見つけるまで苦労するでしょうね。でも、考えてみたら、Unix ( もち Linux も含む)だと、バッチ(シェルスクリプト)の中から自分自身を呼び出したりすると、もっと恐ろしい目にあったりしますよね。私は経験あります。昔たくさんの人に迷惑をかけました…
関連記事