6

xp_cmdshell を使用するとハングするという問題があります。

  1. 実行可能ファイルが呼び出され、その作業を実行して終了します。exeのUIプロンプトが原因でハングしていません。exeはまったくハングしていません。タスク マネージャーのプロセス リストから exe が消え、exe からの内部ログによって、メイン関数の最後の行が実行されたことが確認されます。

  2. xp_cmdshell への呼び出しは、SQL で制御を返しません。その行でハングします (バッチの最後の行です)。プロセスを強制終了しても効果がありません。ハングしたプロセスを取り除くには、実際にはSQLサーバーを再起動する必要があります(うーん)

  3. ハングは、最初の実行時にのみ発生します。最初の呼び出しがハングしている限り、同じパラメーターを使用したプロシージャーへの後続の呼び出しは機能し、正常に終了します。SQL が再起動されると、最初の後続の呼び出しが再びハングします。

  4. 違いがある場合は、exe から戻り値を取得しようとしています。SQL プロシージャは次のように終了します。

    exec @i = xp_cmdshell @cmd; @i を返します。

  5. アクティビティ モニターは、プロセスが PREEMPTIVE_OS_PROCESSOPS (他の開発者が見たもの) または PREEMPTIVE_OS_PIPEOPS (現在のテストで見ているもの) の待機タイプでスタックしていると報告しています。

何か案は?

4

3 に答える 3

5

xp_cmdshell を介して無効なコメントを実行したところ、この状況に遭遇しました。

SQL を再起動せずに強制終了できました。コマンドを実行するプロセスを特定し、タスク マネージャーから強制終了しました。

SQL が Windows 2008 以降で実行されていたとします。[タスク マネージャー] の [プロセス] タブ。各プロセスのコマンドラインを表示する列を有効にしました (例: View -> Select Columns..)。

xp_cmdshell で実行したコマンドがわからない場合は、dbcc inputbuffer( SPID ) を参照してください。

于 2013-08-28T01:31:55.387 に答える
3

SQL Server 2008 でも、xp_cmdshell と BCP を含む呼び出しで同じ問題が発生しました。SQLプロセスIDを強制終了しても役に立たず、「KILLED/ROLLBACK」ステータスのままになります。

これを強制終了する唯一の方法は、Windows タスク マネージャーで bcp.exe プロセスを強制終了することでした。

最終的に、xp_cmdshell を呼び出していた sproc 内の間違った SQL に問題を突き止めました。誤って複数のトランザクションをループで開き、それらを閉じていませんでした。BEGIN/COMMIT トランスの問題が修正された後、PREEMPTIVE_OS_PROCESSOPS は二度と戻ってきませんでした。

于 2012-11-23T23:04:48.010 に答える