【问题标题】:Find out if a process finished running查看进程是否已完成运行
【发布时间】:2013-02-05 13:59:24
【问题描述】:

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

我想知道app.exe 的每个进程何时完成(并获取每个进程的特定命令行及其参数),并将其发送给客户端。

有什么想法吗?

【问题讨论】:

标签: c# batch-file process client-server wmi


【解决方案1】:

您是否考虑过从后台工作人员调用此脚本?

你的 backgoundworker 会执行如下操作:

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 状态来测试进程是否完成。您甚至可以在流程完成时更新用户。

希望这会有所帮助!

【讨论】:

  • 首先感谢您的帮助。我正在使用 Process.Start。但是,我正在运行一个主进程,它调用 1 个或多个子进程。 1 个子进程的情况将适用于您在此处编写的代码,因为当子进程终止时,父进程也会终止。但是如果我同时运行 2 个或更多进程,则父进程只有在两个子进程都终止后才会终止。我想知道每个子进程何时终止,所以我想这与不断从服务器计算机的任务管理器获取这些信息有关。我错了吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您的问题不是很清楚,但我假设您要监视由另一个进程启动的进程。换句话说,对他们使用Process.Start() 是没有意义的。

    您可以使用Process.GetProcessByName() 根据应用名称获取正在运行的进程列表。

    当你有这个时,你可以使用the Exited event 找出进程何时退出(你还必须设置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(),直到您得到您期望的答案。

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 2011-08-18
      • 2021-11-08
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 2015-01-09
      • 2014-07-22
      相关资源
      最近更新 更多