2013-02-05 45 views
1

我有一臺服務器接收來自客戶端的命令並運行它們。 這些命令使用一個特定的批處理腳本,它接收參數和運行。 腳本使用這些參數調用外部控制檯應用程序。 參數還可以指示腳本在後臺運行控制檯應用程序的多個實例。因此,結果可能是一個開放的CMD,在後臺運行3個app.exe實例。找出一個進程是否完成運行

我想知道app.exe這些進程中的每一個何時完成(並獲取每個人的具體命令行及其參數),並將其發送給客戶端。

任何想法?

+0

快速搜索:http://stackoverflow.com/questions/611094/async-process-start-and-wait-for-it-to-finish –

回答

0

如果您使用Process.Start啓動您的進程,它應該返回一個Process對象,您可以使用它來跟蹤生存期,並使用屬性HasExited和ExitTime可以確定它是否結束以及何時結束。

2

你有沒有想過從後臺工作者調用這個腳本?

您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狀態做,你可以測試一下。當過程完成時,您甚至可以更新用戶。

希望這會有所幫助!

+0

感謝您的幫助,首先。我正在使用Process.Start。但是,我正在運行一個主進程並調用1個或多個子進程。 1子進程的情況將與你在這裏編寫的代碼一起工作,因爲當子進程終止時,父進程也是如此。但是,如果我一起運行2個或更多進程,則只有在兩個子進程都終止後,父進程纔會終止。我想知道每個子進程何時終止,所以我想這與從服務器計算機的任務管理器不斷獲取此信息有關。我錯了嗎? – Idanis

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(),直到你得到你期待的答案。

相關問題