2014-03-25 83 views
0

是否可以使用powershell檢測IIS工作進程線程死鎖,然後觸發應用程序池回收?檢測到IIS工作進程死鎖並重新啓動應用程序池

原因:我有一個網站在GAC中調用一個程序集,有時會導致線程死鎖,唯一的解決方法是回收IIS中網站的應用程序池,令人討厭的是用戶有在我被告知之前注意它,自動執行這個過程是很好的。

+0

這幾乎是不可能的,因爲IIS不公開任何API。如果你想實現它,你需要使用原始的Win32 API,這對於基於PowerShell的解決方案來說是相當困難的。 –

回答

0

這就是我該怎麼做的。首先,我們必須找到一種方法來檢測線程是否死鎖。我猜測你可以用一個像ping這樣簡單的東西來做到這一點。然後我們必須回收應用程序池。

# Load IIS module: 
Import-Module WebAdministration 

# Set a name of the site we want to recycle the pool for: 
$site = "Default Web Site" 

# Get pool name by the site name: 
$pool = (Get-Item "IIS:\Sites\$site"| Select-Object applicationPool).applicationPool 

#Check to see if the site is deadlocked. 
if(!(Test-Connection -ComputerName Server -Quiet)) 
{ 
    #Site is Deadlocked. Recycle the application pool: 
    Restart-WebAppPool $pool 
} 
+0

奇怪的是,除了用戶轉到調用其他程序集的特定頁面時,該網站可以正常工作,因此從技術上說,它不是工作進程死鎖的,它只是管道中的一些線程。 (通過資源監視器發現 - 分析等待鏈) –

+0

聽起來好像你需要找到其他程序集的問題,或者讓你的代碼啓動一個看門狗定時器,這樣如果在10秒後沒有收到請求,就會拋出一個錯誤或其他信息可以被捕獲和處理或類似的東西(請參閱:http://msdn.microsoft.com/en-gb/magazine/cc163618.aspx)。問題是,在線程級別檢測死鎖進程時,很難在沒有大量代碼的情況下進行檢測。例如。要使用Wait Chain Traversal API(即您如何檢測它),請參閱:http://msdn.microsoft.com/en-us/library/windows/desktop/ms681418(v=vs.85).aspx – HAL9256

相關問題