我有一台服务器从客户端接收命令并运行它们。
这些命令使用一个特定的批处理脚本,它接收参数并运行。
该脚本使用这些参数调用外部控制台应用程序。
参数还可以指示脚本在后台运行控制台应用程序的多个实例。因此,结果可能是一个开放的CMD
,在后台运行3个app.exe
个实例。
我希望知道app.exe
的每个进程何时完成(并使用其参数获取每个特定的命令行),并将其发送给客户端。
有什么想法吗?
答案 0 :(得分: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状态来测试是否完成了该过程。您甚至可以在流程结束时更新用户。
希望这有帮助!
答案 1 :(得分:0)
如果使用Process.Start启动进程,它应该返回一个可用于跟踪生命周期的Process对象,并且使用属性HasExited和ExitTime可以确定它是否结束以及何时结束。
答案 2 :(得分:0)
在你的问题中不是很清楚,但我假设你想要监视由另一个进程启动的进程。换句话说,对它们使用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()
,直到你得到你期望的答案。