2011-10-07 61 views
3

我正在嘗試在c#中創建一個控制檯應用程序,以確認其他應用程序始終在運行。另一個應用程序定期崩潰,我需要每隔幾分鐘檢查一次,如果它停止工作,請重新啓動它。驗證另一個應用程序始終在運行

有很多關於SO的問題,確保地址不超過一個應用程序實例正在運行。我試圖確認一個(沒有更多或更少)在任何時候都在運行。

有人知道如何開始接近這個嗎?

+1

http://stackoverflow.com/questions/1742787/check-if-a-specific-exe-file-is-running可能是有關您的題。至少,它具有按進程名稱獲取進程列表的代碼。 –

+0

你可以在你正在看的應用程序上調用一些方法或東西嗎?但爲什麼該應用程序崩潰?在你擔心這件事之前,你是否需要解決這個問題......如果可以的話,根本解決問題。 –

+0

@Sergey這正是我所需要的。非常感謝! – carlbenson

回答

7

我會建議使用System.Diagnostics.Process.GetProcessesByName,看看你的進程正在運行,然後,如果沒有,用System.Diagnostics.Process.Start啓動處理。

var processes = Process.GetProcessesByName("yourProcessName"); 

if(processes.Length == 0) 
{ 
    Process.Start(@"C:\Path\To\Your\Process.exe"); 
} 

// Kill the extras 
for(int i = 1; i < process.Length; i++) 
{ 
    processes[i].Kill(); 
} 
+0

完美的作品 - 非常感謝 – carlbenson

0

您有幾個選項。首先是使用Process類檢查正在運行的進程。我從微軟網站得到了這個消息,但它看起來像是有效的:

public bool IsProcessRunning(string name) 
{ 
    //here we're going to get a list of all running processes on 
    //the computer 
    foreach (Process clsProcess in Process.GetProcesses()) 
    { 
     if (clsProcess.ProcessName.StartsWith(name)) 
     { 
      //process found so it's running so return true 
      return true; 
     } 
    } 

    //process not found, return false 
    return false; 
} 

你也可以使用進程間通信。這是我們在家裏做的事情。我們有一個觀察器應用程序,它向被監視的服務發送消息。如果服務在超時時間內沒有返回ACK,我們嘗試重新啓動它。

1

如果實現了「不超過一個」規則(這是證據充分的,正如你指出),然後執行定期碰撞檢查,這應該足以確保一個且只有一個複製正在運行。

事實上,定期過程甚至不必檢查崩潰。它可以啓動一個實例,如果另一個實例已經運行,它將立即退出,這要歸功於您實現的任何「不超過一個」機制。這還有一個好處,就是避免檢測死亡進程和啓動新進程之間的競爭條件。

+1

你的第二點非常有效。但是我必須考慮這一點的含義。每五分鐘啓動一個新實例,並在檢測到另一個實例時立即停止,可能會產生無法預料的後果/開銷。 – carlbenson

+0

@CarlBenson:不要忘記,無論如何,你每五分鐘就會開始一個新流程。還要注意我關於種族條件的其他觀點。它們可能不太可能,但具有併發性的一般規則是,如果它*可能發生,它將*發生。防止多個正在運行的進程的通常方法是讓唯一的實例鎖定指定資源的整個生命週期,這使競爭條件成爲不可能。每隔幾分鐘運行一次的程序就無法做到這一點。此外,沒有任何東西阻止你實現進程列表檢查和互斥鎖定。 –

3

這些命令來控制過程中有用:

// check for processes 
Process[] processes = Process.GetProcessesByName("nameOfExecutable"); 
foreach (Process proc in processes) 
{ 
    // do stuff 
} 

// start process (need path) 
Process.Start("pathToExecutable"); 

// close gui process gently (if needed) 
bool status = proc.CloseMainWindow(); 

// wait for process to close gently 
bool status = proc.WaitForExit(killTimeMS); 

// force close (kill) process 
proc.Kill(); 
相關問題