- ベストアンサー
複数の自作バッチプロラムの共有ログを採取する方法
- 複数の自作バッチプロラムの共有ログを採取する方法について調査しました。バッチプログラムの開始前後にログ出力する方法や、バッティング時のログ取得について検討しました。dos batファイルとvbsを使用して実験を行いましたが、バッティング時のログ取得には問題がありました。複数のアプリで同じファイルにIOする場合には、仕組みが足りない可能性があります。
- バッチプログラムの開始前後にログ出力をするための方法として、dos batファイルとvbsを使用して実験しました。dos batファイルでは、ログを開始時と終了時に出力する方法を採用しました。しかし、バッティングした際に後から行った方のログが正しく取得できない問題が発生しました。vbsでは、Scripting.FileSystemObjectを使用してファイルにログを書き込む方法を採用しました。しかし、バッティングした際に後から行った方がエラーとなりました。複数のアプリで同じファイルにIOするための仕組みには、改善の余地があるかもしれません。
- 複数の自作バッチプロラムの共有ログを採取する方法について調査しました。dos batファイルとvbsを使用してログ出力の実験を行いましたが、バッティング時のログ取得には問題がありました。特に後から行った方のログが正しく取得できないという問題がありました。複数のアプリで同じファイルにIOする場合には、仕組みが足りない可能性があるため、改善が必要かもしれません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
基本的には1,2番さんの方法でいいのですが、「(1)ファイルが無いことを確認してから(2)ファイルを作る」という方法では、(1)と(2)の間という短いタイミングで重なりが発生する可能性があります。並行実施数と頻度次第ですが。 これを避けるためには作成とチェックを同時に行う必要があります。 set LOCK=%TEMP%\LOCK.tmp :WAIT rem 排他制御用ディレクトリを作ってみる。すでにあれば失敗 md %LOCK% 2>NUL rem 失敗なら3秒待ってループする if errorlevel 1 ping localhost >NUL&goto WAIT rem mdが成功したら自分がファイルを使える ~~~ ファイルに書く処理 ~~~ rem 用が済んだのでディレクトリを消す rd %LOCK% 何かの具合でディレクトリが残ってしまうと無限にループするので、実際には回数を数えた方がいいでしょうね。
その他の回答 (2)
- deadline
- ベストアンサー率63% (1239/1943)
#1がちょっと間違ってました。 >@echo off :loop_start1 if exist FileWriting.flg goto loop_start1 (←もう一つのバッチで作成されていたら、ループ。) echo 書き込み中 > FileWriting.flg (←ここじゃないと、永遠にループし続けますね。) >echo %date%-%time%,処理1,開始 >> FILE_TIME.log if exist FileWriting.flg del FileWriting.flg (書き込みが終わったら、削除) >rem 処理1呼び出し :loop_start2 if exist FileWriting.flg goto loop_start2 (←もう一つのバッチで作成されていたら、ループ。) echo 書き込み中 > FileWriting.flg (←こっちも、ここじゃないと、永遠にループし続けますね。) >echo %date%-%time%,処理1,終了 >> FILE_TIME.log if exist FileWriting.flg del FileWriting.flg (書き込みが終わったら、削除) ラベルにジャンプする前に、for文などにより、ループを遅延させるような処理をすると良いかもしれません。
お礼
ありがとうございます。 わざわざ、確認訂正していただいてすみません。
- deadline
- ベストアンサー率63% (1239/1943)
非常に単純な方法ですが、書き込み中であることを意味するフラグ代わりのファイルをもう一つ作成して、if 文でループさせてはどうでしょう? >@echo off echo 書き込み中 > FileWriting.flg :loop_start1 if exist FileWriting.flg goto loop_start1 >echo %date%-%time%,処理1,開始 >> FILE_TIME.log if exist FileWriting.flg del FileWriting.flg >rem 処理1呼び出し echo 書き込み中 > FileWriting.flg :loop_start2 if exist FileWriting.flg goto loop_start2 >echo %date%-%time%,処理1,終了 >> FILE_TIME.log if exist FileWriting.flg del FileWriting.flg
補足
ありがとうございます。 ファイルやディレクトリの存在確認とループを組み合わせるパターンは考えました。 結構煩雑な感じになるので、ファイルのオープン時に「別のがつかんでたら待つ」みたいな事できたら良いのになって、考えていましたが、そういうのはできないのでしょうか?
補足
ありがとうございます。 なるほど、処理の排他をもう少しシビアにするという事ですね。 究極的には、データベースを立てて管理テーブル作って、処理監視とログをそこに吐けば良さそうなものですが、可能な限り簡易的で、途中でコケたり、予期せぬ何かで、カスが残っても大丈夫か、そもそもカスのできない方法が良いのですが、なかなか難しそうですね。