1

クライアントからコマンドを受信して​​実行するサーバーがあります。これらのコマンドは、引数を受け取って実行する 1 つの特定のバッチ スクリプトを使用します。スクリプトは、これらの引数を使用して外部コンソール アプリケーション プログラムを呼び出します。引数は、コンソール アプリケーションの複数のインスタンスをバックグラウンドで実行するようにスクリプトに指示することもできます。CMDそのため、バックグラウンドで の3 つのインスタンスを実行している 1 つの open という結果になる可能性がありapp.exeます。

これらのプロセスのそれぞれがいつ終了するかを知りたいapp.exe(そして、それぞれの特定のコマンド ラインとその引数を取得する)、それをクライアントに送信します。

何か案は?

4

3 に答える 3

2

このスクリプトをバックグラウンド ワーカーから呼び出すことを考えたことはありますか?

バックグラウンド ワーカーは次のように実行します。

static void ExecuteCommand(string command)
{
    int exitCode;
    ProcessStartInfo processInfo;
    Process process;

    processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
    processInfo.CreateNoWindow = true;
    processInfo.UseShellExecute = false;
    // *** Redirect the output ***
    processInfo.RedirectStandardError = true;
    processInfo.RedirectStandardOutput = true;

    process = Process.Start(processInfo);
    process.WaitForExit();

    // *** Read the streams ***
    string output = process.StandardOutput.ReadToEnd();
    string error = process.StandardError.ReadToEnd();

    exitCode = process.ExitCode;

    Console.WriteLine("output>>" + (String.IsNullOrEmpty(output) ? "(none)" : output));
    Console.WriteLine("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error));
    Console.WriteLine("ExitCode: " + exitCode.ToString(), "ExecuteCommand");
    process.Close();
}

static void Main()
{
    ExecuteCommand("echo testing");
}  

このようにして、BackgroundWorker.IsBusy 状態をチェックすることで、プロセスが完了したかどうかをテストできます。プロセスが終了するたびにユーザーを更新することもできます。

お役に立てれば!

于 2013-02-05T14:11:03.243 に答える
0

Process.Start でプロセスを開始すると、有効期間を追跡するために使用できる Process オブジェクトが返され、プロパティ HasExited および ExitTime を使用して、プロセスが終了したかどうか、いつ終了したかを判断できます。

于 2013-02-05T14:06:22.847 に答える
0

あなたの質問ではあまり明確ではありませんが、別のプロセスによって開始されたプロセスを監視したいと考えています。つまり、それらに使用しても意味がありませんProcess.Start()

Process.GetProcessByName()アプリケーション名に基づいて実行中のプロセスのリストを取得するために使用できます。

それができたらExitedイベントを使用してプロセスがいつ終了するかを調べることができます ( も設定する必要がありますEnableRaisingEvents)。例えば:

var processes = Process.GetProcessesByName(processName);
foreach (var process in processes)
{
    Console.WriteLine("{0} running.", process);
    process.Exited += (sender, e) => Console.WriteLine("{0} exited.", sender);
    process.EnableRaisingEvents = true;
}

競合状態があることに注意してください。呼び出しの後、GetProcessesByName()イベント ハンドラーを設定する前にプロセスが終了した場合、Exitedイベントが発生しない可能性があります。

もう 1 つの問題は、アプリケーションがいつ開始されたかを把握する方法です。新しく開始されたプロセスを監視できるようにするものは何も知らないので、GetProcessesByName()期待する答えが得られるまで、 を繰り返し呼び出す必要があると思います。

于 2013-02-05T14:12:11.383 に答える