- PR -

Process.Startでの複数起動

1
投稿者投稿内容
tossi
会議室デビュー日: 2006/09/21
投稿数: 6
投稿日時: 2006-09-21 17:30
OS WindowsXP 言語VS2003 VB.NET

Process.Start(ProcessStartInfo)を使用して、複数回外部プログラムを起動することはできないのでしょうか?

MSDNのマニュアルには以下のように、実行中の場合は新しいプロセスが起動されないようなことが書いてあります。
---------------------------------------------------------------------
このオーバーロードを使用し、 ProcessStartInfo インスタンスを指定してプロセス リソースを起動します。このオーバーロードは、リソースを新しい Process コンポーネントに関連付けます。プロセスが既に実行されている場合、追加のプロセス リソースは起動されません。代わりに、既存のプロセス リソースが再利用され、新しい Process コンポーネントは作成されません。
---------------------------------------------------------------------

テストしてみたところ、cmd.exeとrsh.exeが実行した分起動しているため、どのような場合に起動されないのかが不明です。

以下ソース作成したソース------------------------------------------------------
Dim psi As New System.Diagnostics.ProcessStartInfo
'ComSpecのパスを取得する
psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
psi.RedirectStandardInput = False
psi.RedirectStandardOutput = False
psi.UseShellExecute = False
' ウィンドウを表示しないようにする
psi.CreateNoWindow = True
psi.Arguments = "/C RSH.exe " + HostName + " -l " + sUserName + " -n " + _
ShellPath + ShellName + シェルへの引数

Dim p As Process = Process.Start(psi)
---------------------------------------------------------------------
これを繰り返し実行しています。

よろしくお願いします。


[ メッセージ編集済み 編集者: tossi 編集日時 2006-09-22 19:18 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-09-22 22:57
 少なくとも、「再利用したこと」は、戻り値が Nothing かどうかで判断できますよね?


 それで、「起動されていない場合があり」というのを、どの様にして確認しましたか?
* 起動されたけど何もせずに終了した
* 起動されたけど、エラーですぐに終了した
* 起動され、正常に動作したが、そのことを確認できるような出力がないパスを通った
などと違い、「起動できなかった」ことを、どうやって確認しましたか?

また、「場合」というのを特定してください。

あと、書かれている内容からは
* cmd.exe が起動しない(または、再利用された)
* rsh が失敗した(アクセス拒否、ユーザ不明、ホスト名間違い、サーバからホストへの道がない)
* 実行すべきシェルがない
ということが考えられるのですが、tossiさんは、「再利用ではなく cmd.exe が起動しない」と判断されているようです。その根拠は?


 私は Windows Service から、同じように Process.Start で rsh を起動させましたが、
その時にやらかした失敗は、
UNIX 側に本番 PC を登録し忘れており、テスト環境からは繋がるが、本番環境からは繋がらない、
ということでした。

_________________
tossi
会議室デビュー日: 2006/09/21
投稿数: 6
投稿日時: 2006-09-25 10:49
返答ありがとうございます。

「起動されていない場合があり」というのは、別システムへ起動した分のメッセージを通知するという機能があり、そちらで確認しました。起動したうちの半分程度しか、メッセージ通知が行われておりませんでした。
現象が発生した時点では、ログ出力等の機能や、戻り値を判定する処理が入っておらず、原因がシェルをキックする側にあるのか、シェルにあるのかは掴めておりません。

引用: --------------------------------------------------------------------------------

Jittaさんの書き込み (2006-09-22 22:57) より:

* rsh が失敗した(アクセス拒否、ユーザ不明、ホスト名間違い、サーバからホストへの道がない)
* 実行すべきシェルがない
--------------------------------------------------------------------------------
上記2つに関しては、成功している場合もあるので、原因としてはあてはまらないと判断しました。

そこで、
* cmd.exe が起動しない(または、再利用された)
という方向で考えていたのですが、
「再利用される」というのが、よくわかっておりません。
この場合はcmd.exeが既に起動しているのでcmd.exeを起動できず、その結果、渡している引数(rsh.exe hostname 〜)も受け取ってくれないと認識しましたがあっていますでしょうか?

テスト環境で戻り値Nothingを判定する処理を追加して何度か試しましたが、Nothingが返ってくることがなく、cmd.exeとrsh.exeも正常に実行されているため「再利用される」という場合がどのような結果になるのかがわかりません。

よろしくお願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-09-25 11:19
引用:

「起動されていない場合があり」というのは、別システムへ起動した分のメッセージを通知するという機能があり、そちらで確認しました。起動したうちの半分程度しか、メッセージ通知が行われておりませんでした。



どのくらいの頻度で起動していますか?

あまりにも頻繁に起動していて、rsh サーバがリモート要求を捌ききれていないなんてことはないでしょうか?
tossi
会議室デビュー日: 2006/09/21
投稿数: 6
投稿日時: 2006-09-25 11:29
1サーバに対して最大で連続23回のrshを起動させます。
サーバ側で捌ききれないということも気になっていますが、別の者が調査を行っております。
私の担当はクライアント側なので、クライアントの原因として考えられることを調査しておりました。
ちなみにrshについて私はあまり詳しくないのですが、捌ききれずに、要求が捨てられるということはあるのでしょうか?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-09-25 11:49
引用:

1サーバに対して最大で連続23回のrshを起動させます。



どれくらいの時間の間にですか?
負荷を語るためには、回数だけでなく時間も重要な要素です。

引用:

ちなみにrshについて私はあまり詳しくないのですが、捌ききれずに、要求が捨てられるということはあるのでしょうか?



そりゃありますよ。
何サーバだろうと、無制限に要求を受け付けられるわけではありません。

ただし、その場合、rsh コマンドがなんらかエラーを出してもいいはずではあります。

再現が簡単なら、プロトコルアナライザで要求が出てるのか出てないのか見てみればいいんじゃないですか?

要求すら出てない状況なら、サーバの問題ではまずありえませんから。


[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-09-25 11:52 ]
tossi
会議室デビュー日: 2006/09/21
投稿数: 6
投稿日時: 2006-09-25 12:03
そうですね。正確な時間は計測しておりませんが、
処理としては
1.1つ目のサーバにrshを1つ実行。
2.2、3、4つ目のサーバへと順番にrshを実行。
3.これを23回繰り返します。

この間はこれといって時間のかかる処理を行っておらず、ループでProcess.startを行っていますので、コンマ何秒かの間に1サーバに対して複数回rshコマンドが実行されることになります。
試してみたところ、テスト環境では1サーバに対して1秒間に2回のrshコマンドがクライアントから発行されていました。
1

スキルアップ/キャリアアップ(JOB@IT)