• 締切済み

バックグラウンド実行完了を待つ方法

UNIXシェルスクリプトだと #!/bin/sh test1.sh & test2.sh & wait test3.sh などとしてtest1.shとtest2.shの両方をパラレルで実行してから 両方の完了を待って、test3.shを実行できますが、 これと同じようなことがWindowsのコマンドプロンプトで できないでしょうか。startを使えばバックグラウンドで 実行できることは分かったのですが複数の子プロセスの完了を 待つ、waitに対応するものが無くて困っています。

みんなの回答

noname#51778
noname#51778
回答No.3

古いスレッドを見ていませんでした。 startコマンド(/waitオプション使用)が使えるのではないでしょうか。 詳しくはコマンドプロンプトでのヘルプ、またはWebサイト参照。 余談ですが、whiteline507さんの場合は Windows環境でcygwinを使うのがいいような気がします。 (linuxコマンドがそのまま使えるので手っ取り早いと思います)

whiteline507
質問者

補足

私も最初はstartコマンドの/waitオプションが使えると 思ったのですが、 start test1.bat /wait start test2.bat /wait start test3.bat としても結局test1.batの完了を待ってからtest2.batを実行開始 するのでダメでした。 (したいことはtest1.batとtest2.batを両方同時に実行して、  両方とも完了してからtest3.batを実行するというもの) また、cygwinも入れるには入れているのですが、やりたいことが 「Windowsコマンドの実行時間の計測」ですのでcygwinを介して コマンドを発行してしまうと正確なWindowsの処理速度が計測 できなくなってしまうので敢えて使っていません。 cygwin使ったとしても中身が「copy test1.txt test2.txt」などと 書かれたtest1.batをcygwinから実行することはできるのでしょうか。 cygwinの中でcp test1.txt test2.txtとしてしまうとWindowsの 処理性能が取れないのでNGだと考えています。 色々とお伝えしていないことがあり、申し訳ありませんが 何か名案がありましたら、よろしくお願いいたします。

noname#51778
noname#51778
回答No.2

プログラミングについては、ここで説明するよりもWeb上の多くのサイトを参照するのがベターでしょう。(私も全てWeb上で独習しました。ツールもWeb上で無料で手に入ります。書籍や開発ソフトを買ったことはありません。) 「教えて!goo」にもプログラミングのスレッドがあります。 ほんの一例ですが、下記サイトは実例中心で解りやすいと思います。 「猫でもわかるプログラミング」 http://www.kumei.ne.jp/c_lang/ Windowsプログラム(GUI)、スクリプト(CUI)にしても、結局のところはマイクロソフトのMSDNサイトに尽きるのではないでしょうか。 「MSDN ホームページ」日本語サイト http://www.microsoft.com/japan/msdn/

whiteline507
質問者

お礼

確かに色々と勉強すれば分かることとは思うのですが、 期間が1,2週間と限られており、質問させていただきました。 コマンドプロンプトから簡単な方法で出来ないのであれば この期間で学習してすぐに使いこなすことは無理だと 思うのであきらめます。 教えていただいた関数?がコマンドプロンプトから 追加のソフトやバッチプログラム以外の言語無しに かけるのかどうかだけ教えていただければ幸いです。

noname#51778
noname#51778
回答No.1

ShellExecuteExの実行を WaitForSingleObjectで監視するという方法があります。 マイクロソフトサイトに詳しい説明があります。 ShellExecuteEx http://mtbeta.msdn.microsoft.com/ja-jp/library/aa923541.aspx?altlang=ja-jp WaitForSingleObject http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdllpro/html/_win32_waitforsingleobject.asp

whiteline507
質問者

補足

すみません、紹介していただいたコマンドはコマンドプロンプト から実行できるものなのでしょうか。 ページを見ると 「Winbase.h 内で宣言、Windows.h をインクルード」 「ヘッダー: Shellapi.h にあります。」 などと書いてありますが、WindowsOSにさらに 追加で何かのソフトを入れなければならないのであれば 必要ソフトについても教えていただけますでしょうか。 できればWindows(XPor2003)のみで行える方法があると 助かります。

関連するQ&A

  • バックグランド実行+ログアウトでジョブが残るのは?

    以下のようなシェルをバックグランド実行した後、ログアウトしてもジョブ(プロセス)が残っているのはなぜなのでしょうか? バックグランド実行しても、ログアウトするとバックグランドプロセスはkillされてしまう。だからnohupを使いましょう、、とネットではよく書かれています。自分でこれを検証試みた結果、想定の 動きとならなかったので質問させてもらいました。 以下シェルを 「 ./test01.sh & 」と実行させるのですが、別コンソールでプロセスを監視している限り、最後まで動作し続けるのです。 どなたかおわかりになる方教えてください。 ◇検証用シェル #!/bin/sh echo "start" > ./test01.log for ((i=0 ; i<3 ; i++)); do sleep 60 echo $i >> ./test01.log date >> ./test01.log done

  • [シェルスクリプト内で bashコマンド後のコマンドが実行されない]

    [シェルスクリプト内で bashコマンド後のコマンドが実行されない] 以下の様にシェルスクリプトを記述するとコマンド2が実行されません。 #! /bin/sh コマンド1 bash コマンド2 bash環境でコマンド2を実行させるにはどうしたら良いのでしょうか?

  • 【Linux】シェルの実行方法を教えて下さい。

    【Linux】シェルの実行方法を教えて下さい。 ファイルの中身が#!/bin/bashで始まる拡張子shのシェルがあります。 これを実行するには、どのようなコマンドを打てばよいのでしょうか? 1.rootでログイン。 2.test.shがあるフォルダに、cdで移動する。 3.test.shと入力し、Enterキーを押す。 ↑みたいな感じで良いのでしょうか。 テスト用サーバなので、最悪壊しても良いと上司に言われましたが、 なにぶん時間がないため質問させていただきました。 Redhatでバージョンが3か4だったと思います。 よろしくお願いします。

  • 適切なシェルスクリプトの実行方法について

    シェルスクリプト内でi18nの再読み込みをするために . /etc/sysconfig/i18n と記述するとシェルスクリプト終了後にi18nの内容が反映されていません。 シェルスクリプト自体は ./shell1.sh という形で実行しています。 質問1:このようになるのは「./shell1.sh」と実行したスクリプトは 新たに作成された子プロセスによって実行される為、スクリプトが終了し 親プロセスに戻っても親自身は再読み込みを行なっていないから、という認識で間違いないでしょうか。 質問2:この現象の回避策として「source shell1.sh」とsourceコマンドで シェルスクリプトを実行する方法を試してみました。 実際に上手くいったのですが、「set -e」を使っているとエラー時に ログアウトしてしまうなどの弊害もありました。 他に適切な回避策に問題はないでしょうか。 ご存知のかた、お手数ですがご解答のほど宜しくお願い致します。

  • Linuxでシェルスクリプトがフルパスだと実行できない

    Linuxでシェルスクリプトがフルパスだと実行できない こんにちは 現在linuxでシェルスクリプトを記載していて、やっと出来た!と思ったら、なぜかフルパスで実行すると失敗します。 中身は例えば #!bin/sh echo "hello" とし、ファイル名をtest.shとします。 実行時にカレントからだと上手くいきます。 ./test.sh ただし、フルパスで実行するとうまくいきません。 ./home/user/test.sh エラーは以下 bash: ./home/dv3/tet.sh:No such file or directory 所有者はrootでグループもrootにしてあります。 シェルの権限は755にして、rootで実行しています。 なぜカレントだと上手くいき、フルパスだと上手くいかないのでしょうか? パスが必要なコマンドも入っていないのに。。。 どなたかご教授いただけると幸いです。 宜しくお願い致します。

  • Exit codeの確認方法

    シェルスクリプトを実行するとExitコードが返されると思うのですがどのようにすればそのコード値をコマンドプロンプトから確認できますでしょうか? 例えば以下のようなかんじのものを想定しています。 test.sh | echo exit

  • UNIXのシェル

    シェルに関して質問です。 0526とか0525のところは一日ごとにフォルダが作成されます。 unix\yasu\0526\hobby\test.txt unix\yasu\0526\hobby\test.txt unix\tomo\0525\hobby\test.txt unix\tomo\0525\hobby\test.txt ./check.sh MMDD 実行するときにMMDDのところに日付を入れてフォルダがあればコマンド1を実行するようにしたいです。 引数に指定した文字を判定するにはどうしたらいいのでしょうか? よろしくお願いします。 ----------------------------- #シェルの名前は「check.sh」です #! /bin/sh if [ $1 = "日付" ] ; then コマンド1 else コマンド2 fi -----------------------------

  • シェルスクリプトでバックグラウンドで実行したコマンドの実行結果を取得するには

    OS redhat linux シェル bornシェル シェルスクリプトでバックグラウンドで複数のコマンドを実行し、 すべてのコマンドが正常に終了したら次の処理へ進むみたいな事をしたいのですが、可能でしょうか? 直列にすればよいのですが、処理時間短縮の為、並列に処理したいのです。 宜しくお願いします。

  • 標準出力について

    シェルでシェルを呼び出す処理をバックグラウンドで行っています。その処理を行っている時にログアウトすると、ttyが"?"となってプロセスが残ります。 ここで質問なのですが、この"?"となったプロセスからの標準出力はどこに行われるのでしょうか? 簡単なシェルを書きますと、 TEST1.sh・・・・ #!/bin/sh TEST2.sh & exit 1 TEST2.sh・・・・ #!/bin/sh while true do echo "TEST" done exit 1 で、TEST1.shを呼び出します。 簡単に書くと上記の様な処理となりますが、echo "TEST"はどこに出力されるのか分かる方がいらっしゃいましたらご教授下さい。よろしくお願いします。

  • perlスクリプト内でシェルコマンドを実行するには??

    タイトル通りなのですが、perlスクリプト内でシェルコマンドを実行させる方法が分からなく、困っています。 実行したいシェルコマンドはUNIXのcrontab なのですが・・。 また、perlスクリプト内以外でシェルコマンドを実行する方法はあるのでしょうか?? どなたか分かる方いらっしゃいましたらご教授いただけると幸いです。よろしくお願いします。

    • ベストアンサー
    • Perl