2012-01-04 98 views
1

我有一個運行控制檯.exe應用程序的powershell腳本。控制檯應用程序運行一個Web服務。 Web服務大約需要10分鐘才能完成任務。Powershell腳本超時130秒後

在生產環境中的PowerShell腳本完成後約130秒和Web服務任務被終止。這是核心問題!在當地環境中一切正常。

Powershell版本2在本地和生產中都運行。

從控制檯運行powershell腳本時。在本地,powershell腳本打印控制檯應用程序的返回值。在製作過程中,屏幕上沒有任何內容。它只是顯示一個新的命令提示符。

任務可以在生產環境就好了一個網頁上運行異步。

所有的應用程序代碼/配置文件在本地/生產環境相同。

有意義的唯一事情是PowerShell腳本的超時和終止的控制檯應用程序,反過來終止網絡服務。

已經研究PowerShell的超時,並用不同的腳本播放。但它在本地工作的事實似乎表明了PowerShell的默認設置問題。

本頁面描述超時設置: http://www.ehow.com/how_12026004_set-timeout-powershell.html

但運行:導演的WSMan:當在生產環境中運行\本地主機\殼導致的路徑未找到錯誤。

的PowerScript低於但已刪除所有敏感信息。成功電子郵件在腳本運行後發送。

# attempt to exe file. iex is an alias for the invoke-expression cmd 
iex "Reminder.exe" 

$smtpServer = "" 
$fromAddress = "" 
$toAddress = "" 
$subject = "SUCCESS" 
$msgBody = "" 

# $? lets us know if the previous command was successful or not 
# $LASTEXITCODE gives us the exit code of the last Win32 exe execution 
if (!$? -OR $LASTEXITCODE -gt 0) 
{ 
$subject = "FAIL" 
} 

$smtpClient = new-object Net.Mail.SmtpClient($smtpServer) 
$smtpClient.Credentials = $senderCreds 
$smtpClient.Send($fromAddress,$toAddress,$subject,$msgBody) 
+2

一個注意的事情是,你應該使用'&'來調用Win32程序,而不是'調用,Expression'如'&reminder.exe'。查看Windows PowerShell博客中關於'Invoke-Expression' [here]的更多信息(http://blogs.msdn.com/b/powershell/archive/2011/06/03/invoke-expression-considered-harmful.aspx) 。 – 2012-01-04 20:22:14

+0

只是爲了澄清,'reminder.exe'是您的控制檯應用程序運行的Web服務,是否正確?您還可以更詳細地描述生產環境與本地環境之間在調用腳本方面的區別?您是否使用PowerShell遠程處理在生產系統上遠程運行腳本? – 2012-01-04 20:35:30

+0

正確 - reminder.exe是運行Web服務器的控制檯應用程序。我沒有區別地方和生產之間的差異。本地實際上是用於本地開發的Windows Server 2008 R2框。生產服務器是相同的。 powershell腳本只是從powershell命令行運行(用於測試目的)。 嘗試了$,但無法獲得正確的語法。提醒程序實際上有一個完整的空間路徑。你能提供一個快速的例子嗎? – 2012-01-04 20:46:39

回答

0

我在這裏做了一個不正確的假設。 powershell腳本沒有返回控制檯應用程序的結果。控制檯應用程序失敗。但是,因爲腳本輸出「0」,我認爲它是成功的(由控制檯應用程序返回)。添加以下行PowerShell腳本返回的實際返回值:

Write-Host "CONSOLEEXITCODE : $LASTEXITCODE" 

現在很明顯的控制檯應用程序是失敗,而不是PowerShell腳本(通過巧妙的ping測試建議作爲證明),我添加了一個控制檯.WriteLine寫錯誤(到powershell命令窗口):

內容類型text/html;響應消息的charset = utf-8與綁定的內容類型(text/xml; charset = utf-8)不匹配。如果使用自定義編碼器,請確保已正確實施tContentType方法。

這引發了我一場瘋狂的追逐。這是直到我被困記錄,我發現下面的錯誤任務中的所有Web服務和任務錯誤:

線程已被中止。

定盤作爲增加「線程」超時簡單:

HttpContext.Current.Server.ScriptTimeout = 900; // in seconds 

更好的解決方案可以是在一個單獨的線程異步運行此。

這是此過程工作所需的超時列表。代碼當然取決於語言/實施:

C# Task: HttpContext.Current.Server.ScriptTimeout = 
C# Web Service (that calls task): this.Session.Timeout = 
C# Console Application (that calls web service): mySoapClient.InnerChannel.OperationTimeout = 
Powershell script (that calls console application): not required