こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

締切り済みの質問

.Batの同時実行回避について

今までの説明のしかたが悪かったようですので、改めて投稿させていただきます。

Windows2008Server上の.Batプログラムで作成したジョブで問題がでています。
ジョブをコントロールしているジョブ管理ツールがあります。タスクマネージャとは別のソフトの運用管理ツールです。
このジョブ管理ツールで、ジョブの関係をコントロールしており、前のジョブが終わったら後続のジョブが起動するようになっています。

まず、前のジョブが終了したら、5個のジョブが起動するようにジョブ設計がされています。
この5個のジョブが同時刻で開始すると、1個のジョブだけ成功して、残りの4個が正常終了しないという状況になっています。

イメージとしては、下記のようなところです。

前の処理ZZの後処理に、下記5個のジョブがある。
前の処理ZZ→↓
      A開始→→→→→→終了
      B開始→終了
      C開始→→→→→終了
      D開始→→→→→→→→→終了
      E開始→→→→終了

ジョブ管理ツールでは、前処理と後処理(AからE)の前後関係は作れますが、同時実行を回避することはできません。今回のAからEは、同時刻に開始するとジョブが正常終了しない形となっています。
ちなみに、AからEは、他の会社が作成したもので、できることなら変更を加えたくありません。また、その会社とは契約が切れていて、変更依頼できず、こちらで対応することになっています。

そこで、まず、次の対応しました。あまりやりたくなかったけれど、AからEの処理の先頭にtimeoutで5秒ずつずらす処理を埋め込みました。
しかし、AからEの処理には、ZZ以外に、それぞれ別の前処理がありました。そのそれぞれの前処理は処理時間が一定ではなく、いつ終了するのか分かりません。
そのため、timeoutで5秒ずつずらしても、AからEの処理開始が同時になる可能性があり、実際に同時に実行されることがあるのです。ありえないとは思いますが、発生しているのです。

ジョブの関係としては、次のイメージです。
ABEはtimeoutで5秒ずつずらすことで回避できるが、CDは回避できない。
前の処理ZZの後処理に、下記5個のジョブがある。
前の処理ZZ →→→→→↓
 Aの前処理→→→終了 ⇒A開始→→→→終了   :この場合、ABEが同時開始
 Bの前処理→終了   ⇒B開始→終了      :この場合、ABEが同時開始
 Cの前処理→→→→→→→終了⇒C開始→終了  :この場合、CDが同時開始
 Dの前処理→→→→→→→終了⇒D開始→→終了 :この場合、CDが同時開始
 Eの前処理→→終了 ⇒E開始→→→→終了   :この場合、ABEが同時開始

この状況のため、AからEの処理に、同時起動を制御するプログラムを埋め込むことを考えていますが、どのようにコーディングしていくといいかわかりません。

今考えているのは、
AからEの処理の代わりに、AからEのジョブは、同じ排他制御プログラムを実行するように置き換える。
排他制御プログラムの中で、AからEのジョブを順番に実行するように切り替えるようして、開始時間を切り替えるのは、どうかなと思っています。

(変更後のイメージ)
Aのジョブを排他制御プログラム実行置き換える。
Bのジョブを排他制御プログラム実行置き換える。
Cのジョブを排他制御プログラム実行置き換える。
Dのジョブを排他制御プログラム実行置き換える。
Eのジョブを排他制御プログラム実行置き換える。

排他制御プログラムでは、順番に、A~Eのプログラムを時間をずらして実行する。


ただ、この排他制御プログラム、AからEの処理を置き換える実行プログラムも作成できないスキルです。

この方法でいいのかも検討がついていない状態です。

なにとぞ、ソースプログラムを教えていただきたいところです。
とっくに締め切りが過ぎている問題ですので、大至急でお助けをお願いしたいです。

投稿日時 - 2011-05-23 07:18:19

QNo.6757158

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(3)

ANo.3

A~Eの前処理と本処理は別プログラムでしょうか?
あるいは同じプログラムだが、間に細工は可能とか?
こういう処理ではプロセス起動とミューテックスを
使うのが普通です。これらはWindowsAPIを使って
制御するので、WindowsAPIを呼び出せる言語系で
作る必要があります。但し、プロセス間で継承できる
用に設定する必要があります。
他に、面倒な手続き無しに利用できる資源はファイルと
ウィインドウがあります。ウィンドウのサブクラス化が
できるのであれば、これを使って排他制御を考える
ことができます。これもWindowsAPIを使うので、Cか
VB(Scriptは不可)あたりでないと操作できません。
先ず、次の観点で整理してみてください。
(1)前処理と本処理は分離できるか?
(2)前処理と本処理の間に細工は可能か?
(3)プログラムの言語は何か?
(4)どの言語で、どのくらいのプログラムを作るスキルがあるか?

投稿日時 - 2011-05-23 12:02:24

-広告-

ANo.2

過去のやり取りも読みましたが良く分かりませんね。

あなたがやらせたいこと=仕様を文章できちんと記述してください。これが出来ていないので回答でコーディングは期待できませんよ。例は仕様を理解しやすくするものであって、例でシステムは組めません。

質問内容は「実行例」であって仕様ではないのではないですか。
A-Eのバッチ処理について実行計画の仕様を明示することをお勧めします。

あくまでも記述例ですが、

Aは内部処理:SQL-1を実行する。
BはAのSQL-1の後から実行しなければならない。
CはBが終了してから実行しなければならない。


と言うように仕様をまとめられるのが先でしょう。これが出来れば排他制御が必要な範囲が分かります。

実装は前の質問のところのものを組み込めば良いと思います。

投稿日時 - 2011-05-23 10:21:14

ANo.1

既に適切な回答がついているのに、お礼も言わずクローズもせずに再質問とは失礼な方ですね。
http://okwave.jp/qa/q6753590.html

>この方法でいいのかも検討がついていない状態です。
ここが貴方の問題。
十分なヒントが提示されているのに理解していない。

スキルが無いなら契約先にお金を払って作ってもらえば宜しいのでは?

投稿日時 - 2011-05-23 08:19:39

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-