我有一臺服務器接收來自客戶端的命令並運行它們。 這些命令使用一個特定的批處理腳本,它接收參數和運行。 腳本使用這些參數調用外部控制檯應用程序。 參數還可以指示腳本在後臺運行控制檯應用程序的多個實例。因此,結果可能是一個開放的CMD
,在後臺運行3個app.exe
實例。找出一個進程是否完成運行
我想知道app.exe
這些進程中的每一個何時完成(並獲取每個人的具體命令行及其參數),並將其發送給客戶端。
任何想法?
我有一臺服務器接收來自客戶端的命令並運行它們。 這些命令使用一個特定的批處理腳本,它接收參數和運行。 腳本使用這些參數調用外部控制檯應用程序。 參數還可以指示腳本在後臺運行控制檯應用程序的多個實例。因此,結果可能是一個開放的CMD
,在後臺運行3個app.exe
實例。找出一個進程是否完成運行
我想知道app.exe
這些進程中的每一個何時完成(並獲取每個人的具體命令行及其參數),並將其發送給客戶端。
任何想法?
如果您使用Process.Start啓動您的進程,它應該返回一個Process對象,您可以使用它來跟蹤生存期,並使用屬性HasExited和ExitTime可以確定它是否結束以及何時結束。
你有沒有想過從後臺工作者調用這個腳本?
您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個或更多進程,則只有在兩個子進程都終止後,父進程纔會終止。我想知道每個子進程何時終止,所以我想這與從服務器計算機的任務管理器不斷獲取此信息有關。我錯了嗎? – Idanis
在你的問題中,這不是很清楚,但我假設你想監視由另一個進程啓動的進程。換句話說,對他們使用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()
,直到你得到你期待的答案。
快速搜索:http://stackoverflow.com/questions/611094/async-process-start-and-wait-for-it-to-finish –