- ベストアンサー
自分以外のPerl.exeを強制終了させる方法について
現在、Windows 2000とXPで、perlを、test.batをダブルクリックする形で使っています。 他にも、並列で、いくつか、同様の方法でperlを実行させていますが、test.cgiが終了した時、test.cgi以外のperlプログラムを全て強制終了させたいのですが、何か、良い方法はないでしょうか? ----test.bat--- perl test.cgi ---- ----test.cgi--- sleep 10; exec("taskkill /F /IM perl.exe"); print 'test.cgi以外のperl.exeを強制終了しました'; ---- 上記方法を試してみたのですが、自身のperl強制終了されてしまいます。 実際は、printの部分には様々な動作を行うため、自身のPIDを見つけ出して、それ以外を強制終了するような方法が最適です。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
exec 関数は実行後、制御が戻らないので、 “print”の前にスクリプトが終了してしまいます。 system 関数を使うのが無難な方法だと思います。 また、配列に実行結果を入れたい場合、 バッククオートで実行すると良いと思います。 my @result = `tasklist`; # 当方、XP Home 環境なので、tasklist が無いので未確認です。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
exec って「単純に実行するだけ」じゃなかったっけ? `` とか qx// とか open は使える... かなぁ?
- dummyplug
- ベストアンサー率58% (134/230)
試していないのですけれど、変数$$に自身のPIDが入りますのでaghartaさんの言われるようなtasklistの結果と合わせてほかのperl.exeのPIDがわかるのではないでしょうか。 一応、perl.exeにprint $$;とかさせてみるとそれらしい値が表示されます。 (でも、MS WindowsのPIDの管理の仕方はよくわからない…)
補足
回答いただきありがとうございます。 なるほど、これで、自身のPIDが分かるのですね。 ありがとうございます。とても、参考になりました。 ところで、 @pid = exec("tasklist"); としてみたのですが、printをしていないにも関わらず、 DOS窓には情報が表示され、配列には情報が入りません。 いったいどうすれば、取得できるのかご存知でしたら教えてください。 宜しくお願い致します。
- agharta
- ベストアンサー率52% (54/103)
tasklistというコマンドからすべてのPIDを取得して、 必要なPIDだけを抜き出してはいかがでしょうか。 その後、taskkillでプロセスを終了させる方法でできると思います。 それぞれのコマンドの使用方法は、コマンドプロンプトで tasklist /? taskkill /?
お礼
回答いただきありがとうございます。 その方法も考えてみたのですが、 perl.exeがいくつか動いているため、いったいどれが、自分のPIDか分からず、困っています。 自分以外のperl.exeのPIDが分かれば簡単なんですけどね・・・
お礼
そうですね。systemの方が適切でした。 また、無事、tasklistの結果が配列に入りました! 回答いただきありがとうございます。