从 SQL Server 检查后台进程

Posted

技术标签:

【中文标题】从 SQL Server 检查后台进程【英文标题】:Check background process from SQL Server 【发布时间】:2015-02-13 05:33:04 【问题描述】:

我有一个后台进程正在运行,它可以在运行时在任务管理器中看到。我需要从我的数据库中检查进程是否正在运行 我尝试了以下查询

select * from sys.dm_os_threads
select * FROM sys.dm_os_tasks

但它并没有显示系统上运行的所有进程

【问题讨论】:

这会有帮助吗? SELECT * FROM sys.dm_exec_sessions WHERE is_user_process = 1 感谢您的回复,但这不是我需要的..,这仅提供与 SQL Managenent Studio 相关的过程。我需要的是,需要看到我们在任务管理器中看到的所有进程。 也可以用另一种方式检查,后台应用程序使用本地主机端口。如果从sql有什么方法可以查到端口是否被占用,也很有用。 我认为你的做法是错误的。您为什么使用 SQL Server 作为其他服务的监控工具? 这些视图将只为您提供与 mssql 线程和进程相关的信息,而不是为您在任务管理器下可见的所有进程/任务提供信息。启动时,SQL Server 启动线程,然后将工作线程与这些线程相关联。但是,扩展存储过程等外部组件可以在 SQL Server 进程下启动线程。 SQL Server 无法控制这些线程。 sys.dm_os_threads 可以提供有关在 SQL Server 进程中消耗资源的流氓线程的信息。 【参考方案1】:

我有一个后台进程正在运行,它可以在运行时在任务管理器中看到。我需要从我的数据库中检查进程是否正在运行

我希望您谈论的是后台 SQL Server 进程。以下查询仅显示与 SQL Server 相关的信息

查询DMV可以看到SQL server上运行的所有进程

select * from  sys.dm_exec_requests
select * from sys.dm_exec_sessions 
select * from sys.dm_exec_connections

您可以在线阅读有关这些 DMV 文档的书籍

【讨论】:

不,我不是在询问后台 SQL 服务器进程。假设您打开了一个 Excel 文档,然后在 windows 的任务管理器中,您将能够看到 Excel.exe。我需要从 SQL 查询并检查当前是否有任何 Excel 文档保持打开状态 您可以将后台服务视为一个独立的ADO应用程序。我正在从数据库中检查它,以便将其写入日志文件。 如果您不是在寻找 SQL Server 服务,为什么要使用 SQL Server 标签发布?。另外,如果您想看到更多任务管理器显示的内容,您可以使用 Procmon 来查看内部情况,尽管我不确定它对您有多大帮助【参考方案2】:

use this query

select 
                 tblSysProcess.cmd
               , tblSysProcess.physical_io IOUsage
               , tblSysProcess.cpu as CPUusage
               , tblSysProcess.waittype as waitType
               , tblSysProcess.waittime as waitTime
               , tblSysProcess.lastwaittype as lastWaitType
               , tblSysProcess.waitResource as waitResource
               , tblSysProcess.dbid as databaseID
               , case
                     when (dbid > 0) then db_name(dbid) 
                     else ''
                 end as dbName
               , memusage as memUsage
               , status

       from  master.dbo.sysprocesses tblSysProcess

       where 

              (

                  --background process    
                  (tblSysProcess.spid < 50)

              )

【讨论】:

【参考方案3】:
select db_name(dbid),cmd,spid,status 
from 
    sys.sysprocesses 
        where 
            db_name(dbid) = 'dbname' and status = 'background'

【讨论】:

【参考方案4】:

所以看起来您不是在尝试查看 SQL 服务器进程,而是在机器上为另一个应用程序查看另一个进程,没有任何内置 DMV 或函数能够以本机方式向您显示此信息。你有两个选择,一个是编写一个 CLR 存储过程或函数来检查进程,另一个是使用 xp_cmdshell 来获取任务列表,你可以这样做:

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
GO
EXEC xp_cmdshell 'tasklist.exe'
GO
EXEC sp_configure 'xp_cmdshell', 0
RECONFIGURE

这将列出机器上所有正在运行的进程,如果需要,您可以将这些数据推入表格中以进行进一步分析,或者您可以使用 tasklist.exe 参数来查找您的进程有兴趣。只要记住在不需要时关闭 xp_cmdshell,因为它可能存在安全风险。

【讨论】:

【参考方案5】:

试试这个;

EXEC sp_who1

EXEC sp_who2

SELECT *
FROM   MASTER..sysprocesses

SELECT *
FROM   sys.dm_exec_sessions
WHERE  is_user_process = 1

【讨论】:

@sergio 这也没有给出任务管理器中显示的进程。 Imran sysprocesses 不再被 MS 推荐使用。相反,我们必须使用 sys.sm_exec_requests

以上是关于从 SQL Server 检查后台进程的主要内容,如果未能解决你的问题,请参考以下文章

将 VB6 编译为 Server 2016 上的后台进程

进程测试

如果我们关闭它启动的终端,linux 会杀死后台进程吗?

MS SQL/Powershell:如何杀死可用性组中辅助节点上的后台进程

安全地杀死在 bash 脚本中启动的后台进程

nodejs进程后台运行 不中断