1

我有一个从客户端接收命令并运行它们的服务器。这些命令使用一个特定的批处理脚本,它接收参数并运行。该脚本使用这些参数调用外部控制台应用程序。参数还可以指示脚本在后台运行控制台应用程序的多个实例。因此,结果可能是一个打开的,在后台CMD运行 3 个实例。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.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可能不会引发事件。

另一个问题是如何确定应用程序何时启动。我不知道有什么可以让您监控新启动的进程,所以我认为您将不得不反复调用GetProcessesByName(),直到您得到您期望的答案。

于 2013-02-05T14:12:11.383 回答
0

如果您使用 Process.Start 启动您的流程,它应该返回一个 Process 对象,您可以使用它来跟踪生命周期,并且使用 HasExited 和 ExitTime 属性您可以确定它是否结束以及何时完成。

于 2013-02-05T14:06:22.847 回答