2012-01-04 29 views
1

コンソールの.exeアプリケーションを実行するpowershellスクリプトがあります。コンソールアプリケーションはWebサービスを実行します。 Webサービスは、タスクを完了するのに約10分かかります。130秒後のPowershellスクリプトのタイムアウト

運用環境では、約130秒後にpowershellスクリプトが終了し、Webサービスタスクが終了します。これが中核的な問題です!ローカル環境ではすべてがうまく動作します。

Powershellバージョン2は、ローカルとプロダクションの両方で実行されています。

コンソールからpowershellスクリプトを実行するとき。ローカルでは、powershellスクリプトはコンソールアプリケーションの戻り値を出力します。プロダクションでは、画面に何も印刷されません。新しいコマンドプロンプトが表示されます。

タスクは、プロダクション環境のWebページから非同期で実行できます。

すべてのアプリケーションコード/設定ファイルは、ローカル/プロダクション環境で同じです。

唯一のことは、powershellスクリプトがタイムアウトしてコンソールアプリケーションを終了し、Webサービスを終了させるということです。

パワーシェルのタイムアウトを調べて、別のスクリプトで試してみました。しかし、ローカルで動作するという事実は、PowerShellのデフォルト設定問題を示すようです。

このページでは、タイムアウト設定を説明します。 http://www.ehow.com/how_12026004_set-timeout-powershell.html

しかしランニング:監督のWSMan:生産で実行\ localhostの\パスでシェル結果が見つかりませんエラー。

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

「&reminder.exe」のような 'Invoke-Expression'の代わりに'& 'を使ってWin32プログラムを呼び出さなければなりません。 'Invoke-Expression' [here](http://blogs.msdn.com/b/powershell/archive/2011/06/03/invoke-expression-considered-harmful.aspx)については、Windows PowerShellのブログを参照してください。 。 –

+0

明確にするために、 'reminder.exe'は、Webサービスを実行するコンソールアプリケーションです。また、スクリプトをどのように呼び出しているかという観点から、本番環境とローカル環境の違いをもう少し詳しく説明できますか? PowerShellリモーティングを使用して、本番システムでリモートでスクリプトを実行していますか? –

+0

修正 - reminder.exeは、Webサーバーを実行するコンソールアプリケーションです。私が地元と生産の間で認識している違いはありません。 Localは実際にはローカル開発用のWindows Server 2008 R2ボックスです。プロダクションサーバーは同じです。 powershellスクリプトは、単にテスト目的のためにpowershellコマンドラインから実行されています。 $を試しましたが、構文を正しく取得できません。 reminder.exeには実際には完全なパスが空白になります。簡単な例を提供できますか? –

答えて

0

私はここで間違った仮定をしました。 PowerShellスクリプトは、コンソールアプリケーションの結果を返していませんでした。コンソールアプリケーションが失敗していました。しかし、スクリプトは "0"を出力するので、(コンソールアプリケーションから返された)成功した​​と見なしました。 PowerShellスクリプトに次の行を追加すると、実際の戻り値が返されました:

Write-Host "CONSOLEEXITCODE : $LASTEXITCODE" 

今では(テストが提案賢いピングによって証明される)コンソールアプリケーションは、PowerShellスクリプトを失敗していなかった明らかになったことを、私はコンソールを追加しましたエラーを書き込む.WriteLine(powershellコマンドウィンドウに):

コンテンツタイプtext/html;レスポンスメッセージのcharset = utf-8がバインディングのコンテンツタイプ(text/xml; charset = utf-8)と一致しません。カスタムエンコーダを使用する場合は、IsContentTypeSuppor tedメソッドが正しく実装されていることを確認してください。

これは野生のガチョウの追跡に私を導いた。すべてのWebサービスとタスクのエラーをトラップしてログに記録すると、タスクで次のエラーが検出されました。

スレッドが中止されました。

修正は、「スレッド」タイムアウトを増やすのと同じくらい簡単だった:

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

より良い解決策は、別のスレッドで非同期にこれを実行することであってもよいです。

このプロセスが動作するために必要なタイムアウトのリストです。コードはもちろん言語/実装によって変わります:

関連する問題