我们有一个 Windows 服务,它会生成许多我们可以通过任务管理器看到的进程,这些进程将数据从一个数据库移动到另一个数据库。
示例:当在表 1 中输入新数据时,表 1 中的所有数据都将发送到临时表表 2,状态为 NEW,其中每个行都分配有上述 Windows 进程之一。因此,当数据成功移动到不同的数据库时,表 2 中特定行的状态将设置为 DONE。
有时,Windows 进程会被分配给特定行,但数据库之间不会移动任何数据。就好像现在我们有一个警报系统,如果表 2 中的一行处于 NEW 状态超过 30 分钟,我们就会收到一封邮件。收到邮件后,我们会检查 PID 并通过任务管理器将其终止。一旦它被终止,就会生成一个新进程,记录将在数据库之间移动。
我想知道是否有任何工具可以识别是否有任何进程停止或挂起,只有当我们检查数据库并发现分配给进程 ID 的许多行时,我们才知道该进程已挂起,正常情况下它会在几秒钟内处理
所有 Windows 进程都有相同的名称,如下所示,我们用 PID 来区分
进程1.exe 进程1.exe 进程1.exe 进程1.exe 进程1.exe 进程1.exe 进程1.exe 进程1.exe
我已经检查了资源监视器,但由于有很多进程,因此需要花费很多时间才能确定哪个进程被挂起。
答案1
我相信您可以使用 Windows PowerShell 创建一个计划任务,以发现挂起的进程并终止它们。
经过创建 ODBC 数据源引用数据库,您将能够自动从 Windows PowerShell 脚本中识别挂起的进程。此代码片段可用作起点:
function Get-ODBC-Data{
param(
[string]$query=$(throw 'query is required.'),
[string]$dsn
)
$conn = New-Object System.Data.Odbc.OdbcConnection
$conn.ConnectionString = "DSN=$dsn;"
$conn.open()
$cmd = New-object System.Data.Odbc.OdbcCommand($query,$conn)
$ds = New-Object system.Data.DataSet
(New-Object system.Data.odbc.odbcDataAdapter($cmd)).fill($ds) | out-null
$conn.close()
$ds.Tables[0]
}
参考:https://www.andersrodland.com/working-with-odbc-connections-in-powershell/
之后,你将能够使用以下命令终止那些挂起的进程停止进程 命令。例如,为了终止 PID 为 12345 的进程,发出:
PS> Stop-Process -Id 12345 -Force
您需要安装 Windows Management Framework 3.0 或更新版本才能运行 PowerShell 脚本。有关详细要求,请查看以下页面:https://docs.microsoft.com/en-us/powershell/scripting/install/windows-powershell-system-requirements?view=powershell-3.0