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"'

这会启动一个命令 shell,然后再启动另一个命令 shell 来执行 dir 命令。第一个 shell 在生成第二个(/C 开关)后立即终止,而第二个执行“dir”然后不终止(/K 开关)。由于第二个延迟过程,即使 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 回答