130秒后的Powershell脚本超时

时间:2012-01-04 20:10:36

标签: powershell

我有一个运行控制台.exe应用程序的powershell脚本。控制台应用程序运行Web服务。网络服务大约需要10分钟来完成任务。

在生产环境中,powershell脚本在大约130秒后完成,Web服务任务终止。这是核心问题!一切都在当地环境中运作良好。

Powershell版本2在本地和生产中都在运行。

从控制台运行powershell脚本时。在本地,powershell脚本打印控制台应用程序的返回值。在制作中,屏幕上没有任何内容。它只显示一个新的命令提示符。

任务可以从生产环境中的网页上异步运行。

本地/生产环境中的所有应用程序代码/配置文件都是相同的。

唯一有意义的是powershell脚本超时并终止控制台应用程序,从而终止Web服务。

已经研究过PowerShell超时,并使用过不同的脚本。但它在本地工作的事实似乎表明了PowerShell的默认设置问题。

此页面介绍了超时设置: http://www.ehow.com/how_12026004_set-timeout-powershell.html

但运行:Dir WSMan:\ localhost \ shell在生产中运行时导致找不到路径错误。

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)

1 个答案:

答案 0 :(得分:0)

我在这里做了一个不正确的假设。 powershell脚本没有返回控制台应用程序的结果。控制台应用程序失败了。但是因为脚本输出“0”我认为它是成功的(由控制台应用程序返回)。将以下行添加到powershell脚本返回实际返回值:

Write-Host "CONSOLEEXITCODE : $LASTEXITCODE"

现在很明显控制台应用程序失败而不是powershell脚本(正如聪明的ping测试所证明的那样)我添加了一个Console.WriteLine来写错误(到powershell命令窗口):

  

内容类型text / html;响应消息的charset = utf-8与th不匹配   绑定的内容类型(text / xml; charset = utf-8)。如果使用自定义编码器,请确保IsContentTypeSuppor   ted方法正确实施。

这让我陷入了疯狂的追逐。直到我陷入并记录了所有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