• ベストアンサー

.bat の同時起動を回避したい。

notnotの回答

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4856/10272)
回答No.6

何となく問題がわかった気がします。 ○5つの処理がある ○各処理の先頭に他と平行実行出来ない部分があり、その部分が重なるとエラーになる ○その先頭処理を過ぎた残りの部分の処理は他の処理と平行して実行可能である ○残りの部分の処理にかなり時間がかかるので、処理全体を待つことはしたくない でいいですか? その先頭部分というのが処理開始から10秒以内に終わるとします。下記のコードをバッチファイルの先頭に書くか、別ファイルにして call ファイル名.bat で呼び出してください。 :LOOP md \windows\temp\LOCK 2>NUL if %ERRORLEVEL%==0 goto OK ping -n 1 localhost >NUL goto LOOP :OK start /min cmd /c "ping -n 10 localhost > NUL & rd \windows\temp\LOCK" 仕組みとしては、 1. ロックファイルを作ってみる 2. 作れれば処理可能なので5へ 3. 作れなければ1秒待つ 4. 1へ戻る 5. 別プロセスで、「10秒待ってロックファイルを消す」という処理を走らせる  (この処理自体は10秒待つわけではない) 6. 本来の処理を始める 他の処理は、ロックを取れた処理が始まって10秒たてばロックファイルが消えるので、新たにロックが取れます。

takatai
質問者

補足

早速のご回答、まことにありがとうございます。 下記の条件となります。若干の差異がありますが、対応は可能でしょうか? ○5つの処理がある ⇒はい。 ○各処理の先頭に他と平行実行出来ない部分があり、その部分が重なるとエラーになる ⇒はい。先頭処理の開始時間だけをずらしたいだけで、先頭処理が途中から平行になっても問題はないです。  先頭処理で、最初にミリ秒のタイムスタンプ取得とSQLの実行ファイルを相手先システムに送付し、結果を受け取ります。  相手先システムで、「ミリ秒のタイムスタンプ」でキューイングするのですが、「ミリ秒のタイムスタンプ」が重なる相手先システムで処理が落ちて、結果が受け取れない。このため、先頭処理の、ミリ秒のタイムスタンプ取得をずらせればOKです。 ○その先頭処理を過ぎた残りの部分の処理は他の処理と平行して実行可能である ⇒はい。先頭処理の開始時間だけ、ずれればよい。開始時間だけずれれば、先頭処理の平行実行も可能です。  先頭の処理は、SQL実行が含まれているので処理時間はまちまちです。 ○残りの部分の処理にかなり時間がかかるので、処理全体を待つことはしたくない ⇒はい。他の処理が終わるのは、まちたくない。 (作成方法として) ・ロックファイルを作る以外に、制御できないでしょうか?  処理が正常終了しない場合、ロックファイルが残るので。 下記の部分で、ロックファイルを消すのは分かるのですが、万一10秒待っている間にこの処理が落ちると、ロックファイルがのこってしまう。 10秒というのは、先頭処理を10秒で終わる前提ですが、確実に終了する時間は分からない現状です。 また、先頭処理の開始時間だけをずらしたいだけで、先頭処理が途中から平行になっても問題はないです。 >5. 別プロセスで、「10秒待ってロックファイルを消す」という処理を走らせる > (この処理自体は10秒待つわけではない) なにとぞ、よろしくお願いいたします。

関連するQ&A

  • .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の処理を置き換える実行プログラムも作成できないスキルです。 この方法でいいのかも検討がついていない状態です。 なにとぞ、ソースプログラムを教えていただきたいところです。 とっくに締め切りが過ぎている問題ですので、大至急でお助けをお願いしたいです。

  • BATファイル起動について

    お世話になっております。 javaのclassを実行する 以下の処理を行うbatファイルを作成したところ (ディレクトリ移動→classpathの設定→javaコマンド) cmd.exeよりこのbatファイルを実行すると 正常に動作してくれるのですが batファイルをダブルクリックすると javaを正常に実行しません。 errorや例外も特に発生していません。 batファイルを cmd.exeからの実行するのと ダブルクリックで実行するのには 何か違いがあるのでしょうか? よろしくお願いします。

  • BATファイルの終了

    BATファイルを実行し、 オンラインプログラムを起動していますが、 そのオンラインプログラムが終了しなくても、 起動したBATのコマンドプロンプトを終了させる 方法を教えてください オンラインの起動中に黒のプロンプトが残った ままになっているのが不便ですので

  • BATファイル実行にフォーカスを当てたい

    Windows2008サーバにRDPでWindows7から実行しています。 サーバにBATファイルを作成し、(XCOPYコマンド)データのバックアップを行います。 この時ですが、クライアント(Windows7)で実行させたBATファイルですが(コマンドプロンプト)画面が なぜか背面にかくれてしまい、BATの実行内容がみれなくなることがあります。また、BATの終了時に、正常終了かどうかの表示を行い、Pauseコマンドで止めていますが、これが、背面にかくれてしまい、いつ終ったのかわからない状態です。ずーっとBAT自動されたコマンドプロンプトの表示にフォーカスを当てたいのですが、BATに記述することにより、再度フォーカスを取り戻すようなコマンドはあるでしょうか?よろしくお願いします。

  • batよりjava起動

    お世話になっております。 javaのclassを実行する 以下の処理を行うbatファイルを作成したところ (ディレクトリ移動→classpathの設定→javaコマンド) cmd.exeよりこのbatファイルを実行すると 正常に動作してくれるのですが batファイルをダブルクリックすると javaを正常に実行しません。 errorや例外も特に発生していません。 batファイルを cmd.exeからの実行するのと ダブルクリックで実行するのには 何か違いがあるのでしょうか? 最終的な目的はタスクにこのbatを登録し 指定した時間に定期的に実行する事なのですが、 タスクにbatを登録して実行した場合 batをダブルクリックした時と同様の現象になり 正常に動作しませんでした。 原因をご存知の方がいらっしゃいましたら 教えて頂けないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • batでchromeを起動・終了させたい

    batでchromeを起動終了させたいのですが、 start C:\Program Files (x86)\Google\Chrome\Application\chrome.exe を実行後 batが止まってしまいます。 このまま(もしくはchrome.exeをtaskkill)で次の処理にすすめたいのですが、いい方法ありませんか?

  • batファイルの強制終了を回避したい

    batファイルを作成する際、 batファイルに書かれた処理が終わると、batファイルは終了してしまいますが、それを回避したいです。 例えば、カレントディレクトリをE:\work_folderにして作業をしたいときに、 cd E:\work_folder; とだけ記述されているbatファイルを作ったら、 ディレクトリを変更したらそのまま終了してしまって、 作業を続けられませんし、 また、 cd E:\work_folder; pause; と記述したら、『続行するには何かキーを押してください . . .』 のメッセージの後、何かのキーを押した後に、結局DOSプロンプトは閉じてしまいます。 継続してコマンドを打ちたいのですが不可能でしょうか?? 宜しくお願いします。

  • Windows95のBATファイル実行

    皆様是非、御教授ください。 Windows95にてBatファイルを作成しました。 複数の実行(EXE)プログラムが起動するように したのですが、起動すると実行が完了しない状態で 次のプログラムが走ってしまいます。 WindowsNT上のように実行完了した後に次へ処理が 移る方法はないのでしょうか。 宜しく、お願い致します。

  • 複数のバッチを同時並行で起動したいNo2

    No.2002566で質問した者です。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2002566 環境:Windows2003Server バッチファイルの中に複数のバッチファイルを呼んでいるのですが、同時並行で実行することは可能でしょうか? サーバにCPUが4つあるのですが一回の実行ではタスクが分散されず1CPUで負荷がかかってしまって対応方法を考えています。複数のバッチに分けてから同時に実行した場合はタスクも複数になる為、処理が分散されるのではないかと思っているのですが・・・。 ↑ 現在「start C:\xxx\yyy.bat」コマンドで4つ同時並行で実行しておりタスクが分散されて負荷が軽減されています。 が、また問題が発生してしまいました。。 JP1で登録されているのですが上記バッチが終了していないのにもかかわらず次の登録バッチが実行されてしまいます。 対応としては4つのバッチのうち処理が一番重いバッチを「call」で呼ぶことにしています。 理想としては全てのバッチが終了したら親元のバッチを終了させるようにしたいのですが・・。 何かいい方法があればアドバイスお願い致します。

  • バッチファイルを1個だけしか起動しないようにしたい

    エクスプローラー上から バッチファイル(test.bat)を ダブルクリックしてバッチファイルを実行しています。 通常はコマンドプロンプトが1個だけ表示されて、 バッチファイルが実行して実行が終了すると コマンドプロンプトも閉じられます。 しかし、時々、 コマンドプロンプトが2個表示されることがあります。 つまり、ダブルクリックが、 1回ではなく2回実行されたと誤認識されて、 同じバッチファイル(test.bat)が 2つ起動してしまったと思われます。 当然、その後の処理はおかしくなります。 (バッチファイル(test.bat)の中に 何らかのコードを追加するなどして) 必ず1個だけしか起動しないようにすることは、 できないでしょうか。 (Windows10)