0

次のストアドプロシージャを作成しました。

CREATE PROCEDURE [dbo].[_StartWebcamStream]
AS

BEGIN
    declare @command varchar(200)
    set @command = 'C:\startStream.bat'
    exec master..xp_cmdshell @command

END

バッチファイルを実行するためstartStream.bat。このバッチには、次のコードが含まれています。

"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe" -I dummy -vvv rtsp://mycamaddress/live_mpeg4.sdp --network-caching=4096 --sout=#transcode{vcodec=mp4v,fps=15,vb=512,scale=1,height=240,width=320,acodec=mp4a,ab=128,channels=2}:duplicate{dst=http{mux=asf,dst=:11345/},dst=display} :sout-keep}

バッチファイルは正しく起動されますが、クエリはvlcが停止するまで実行され続けます。

vlcを実行させるクエリを停止するにはどうすればよいですか?

4

1 に答える 1

2

免責事項:これらの例を本番環境で実行しないでください。


SQL Serverは、xp_cmdshellによって生成されたすべてのプロセスを監視し、それらが終了するのを待ちます。このステートメントを実行できることを確認するには、次のようにします。

EXEC xp_cmdshell 'cmd /C "start cmd /K dir"'

これによりコマンドシェルが開始され、次に別のコマンドシェルが開始されてdirコマンドが実行されます。最初のシェルは2番目のシェルを生成した直後に終了し(/ Cスイッチ)、2番目のシェルは「dir」を実行してから終了しません(/ Kスイッチ)。その2番目の長引くプロセスのために、SQL Serverが直接開始したプロセスがなくなっても、クエリは返されません。キャンセルすることすらできません。SSMSでウィンドウを閉じても、要求は引き続き実行されます。あなたはそれをチェックすることができます

SELECT r.session_id, t.text 
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t

このNO_OUTPUTパラメーターは、次のいずれにも役立ちません。

EXEC xp_cmdshell 'cmd /C "start cmd /K dir"', NO_OUTPUT;

同じ「スティッキー」な動作が表示されます。

これらを取り除く唯一の方法は、コンピューターを再起動するか、プロセスを手動で強制終了することです(タスクマネージャーを管理者として実行する必要があります)。SQL Serverサービスを再起動しても、生成されたプロセスは停止しません。


解決策として、SQLエージェントを使用できます。これには、プログラムの実行に使用できる「オペレーティングシステム(CmdExec)」ステップタイプがあります。ジョブを作成してから、を使用して開始できますsp_start_job

いずれにせよ、プロセスは実際にはある時点で終了する必要があります。そうしないと、プロセスの山が作成されます。これは、長期的にはパフォーマンスの問題を引き起こす「ボディ」です。

于 2013-01-21T16:16:41.807 に答える