2013-02-05 3 views
1

클라이언트에서 명령을 수신하고 실행하는 서버가 있습니다. 이 명령은 인수를 받고 실행되는 특정 배치 스크립트를 사용합니다. 스크립트는 이러한 인수를 사용하여 외부 콘솔 응용 프로그램을 호출합니다. 인수는 백그라운드에서 콘솔 응용 프로그램의 여러 인스턴스를 실행하도록 스크립트에 지시 할 수도 있습니다. 따라서 결과는 CMD 중 하나 일 수 있으며 백그라운드에서 app.exe의 3 인스턴스를 실행합니다.프로세스가 실행 완료인지 확인

app.exe의 각 프로세스가 끝나고 각 명령의 인수가있는 특정 명령 줄을 가져올 때를 알고 싶습니다. 그리고이를 클라이언트에 보냅니다.

아이디어가 있으십니까?

+0

빠른 검색 : http://stackoverflow.com/questions/611094/async-process-start-and-wait-for-it-to-finish –

답변

0

Process.Start를 사용하여 프로세스를 시작하면 수명을 추적하는 데 사용할 수있는 Process 개체가 반환되어야하며 HasExited 및 ExitTime 속성을 사용하여 작업이 끝났는 지 또는 완료되었는지를 확인할 수 있습니다.

2

backgound 작업자로부터이 스크립트를 호출하는 것에 대해 생각해 보셨습니까?

당신의 backgoundworker는 다음과 같이 실행합니다 : 프로세스가 BackgroundWorker.IsBusy 상태를 확인하여 이루어집니다 경우 테스트 할 수 있습니다

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"); 
} 

이 방법. 프로세스가 끝나면 사용자를 업데이트 할 수도 있습니다.

희망이 도움이됩니다.

+0

먼저 도움을 제공해 주셔서 감사합니다. 나는 Process.Start를 사용하고있다. 그러나 주 프로세스를 실행 중이며 하나 이상의 하위 프로세스를 호출합니다. 하위 프로세스가 종료 될 때 부모 프로세스도 종료되므로 여기에 작성한 코드로 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()에 전화해야한다고 생각합니다.

관련 문제