我有一个从客户端接收命令并运行它们的服务器。这些命令使用一个特定的批处理脚本,它接收参数并运行。该脚本使用这些参数调用外部控制台应用程序。参数还可以指示脚本在后台运行控制台应用程序的多个实例。因此,结果可能是一个打开的,在后台CMD
运行 3 个实例。app.exe
我想知道这些过程中的每一个何时app.exe
完成(并获得每个人的特定命令行及其参数),并将其发送给客户端。
有任何想法吗?
我有一个从客户端接收命令并运行它们的服务器。这些命令使用一个特定的批处理脚本,它接收参数并运行。该脚本使用这些参数调用外部控制台应用程序。参数还可以指示脚本在后台运行控制台应用程序的多个实例。因此,结果可能是一个打开的,在后台CMD
运行 3 个实例。app.exe
我想知道这些过程中的每一个何时app.exe
完成(并获得每个人的特定命令行及其参数),并将其发送给客户端。
有任何想法吗?
您是否考虑过从后台工作人员调用此脚本?
您的后台工作人员将执行如下操作:
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()
对它们使用没有意义。
您可以使用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()
,直到您得到您期望的答案。
如果您使用 Process.Start 启动您的流程,它应该返回一个 Process 对象,您可以使用它来跟踪生命周期,并且使用 HasExited 和 ExitTime 属性您可以确定它是否结束以及何时完成。