• ベストアンサー

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

dscriptyの回答

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.8

ついに問題の核心↓を書いたね。 『相手先システムで、「ミリ秒のタイムスタンプ」でキューイングするのですが、「ミリ秒のタイムスタンプ」が重なる相手先システムで処理が落ちて、結果が受け取れない。』 タイムスタンプが同じだと、処理が失敗するなんて、どんな設計だよ! 同時が無理なら、何でミリ秒。。。?百歩ゆずってマイクロ秒! という突っ込みはおいといて、 解決案(A) - 開発会社にやらせる 『ジョブ管理ツール作成と基本的な管理の為のバッチファイル作成』がその「他の会社」との契約内容なら、やっつけ仕事もいいところだよ! 契約が切れていていても、瑕疵期間(たいてい 6ヶ月~1年ぐらいかな?)が設定されているかもしれないよ、上司に相談して契約内容を確認してみるのはどう? 解決案(B) - 自分で解決する。 「先頭処理で、最初にミリ秒のタイムスタンプ取得」するのなら、次の手順でその問題を回避できるよ。 同じタイムスタンプで 「SQLの実行ファイルを相手先システムに送付」しないように、取得したタイムスタンプを比較するために、TIMESTAMP.TXT というファイルを使うことにするよ。 1) 先頭処理で、取得したタイムスタンプと TIMESTAMP.TXT を比較して、同じなら、0.1秒以上待って、もう一度タイムスタンプを取得するところから始める。比較した結果が異なれば、2) へ進む。そもそも TIMESTAMP.TXT が存在しなければ、2) へ進む。 2) 今回取得したタイムスタンプを TIMESTANP.TXT へ保存する。 3) 処理を継続して、SQLの実行ファイルを相手先システムに送付する。 ちなみに、この解決方法も含めて [ANo.1] ~ [ANo.7] のやり方でも、100万回に 1回あるかないかわからないけれど、同じタイムスタンプで 「SQLの実行ファイルを相手先システムに送付」してしまう可能性は残るよ。 でも、失敗したときに、『ごめんなさい』で済むなら、運用上は問題ないかな。

関連する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)